全局模式下的正则表达式

简介:

在全局模式(global)下使用正则表达式,有一些需要特别注意的地方,先来看一段有意思的代码:

 
  1. <script> 
  2. var reg = /\d/g; 
  3. var str = "1"
  4. alert(reg.test(str));  //应该弹出true
  5. alert(reg.test(str));  //应该弹什么呢?
  6. alert(reg.test(str));  //这次呢?
  7. </script> 

直观感觉它应该三次都弹出true,但实际上运行一下,三次的结果分别是:true / false / true。这是为什么呢?

原因在于使用正则表达式的全局模式时,在正则实例上调用test方法,会更改其lastIndex属性,而此属性指示了匹配的开始位置,所以第一次调用test时lastIndex=0,能匹配上,匹配完成后lastIndex变为1,第二次调用test时lastIndex=1,就匹配不上了,此时lastIndex回0,第三次调test时lastIndex=0,所以又能匹配上了。

需要注意的是,将正则实例作为参数传入时,不会影响lastIndex属性。

进一步深入一下,不同浏览器上还会有细微的差别:

在IE下:
    lastIndex 属性会被 RegExp 实例的 exec 、test 方法,以及String实例的match、replace、split、search 方法修改;

在Firefox、Opera、Safari、Chrome下:
    lastIndex 属性会被 RegExp 实例的 exec、test 方法修改,但不会被 String 实例的各个方法修改;


来看几个例子加深一下理解:

1、创建一个正则实例并指明了global全局模式,然后两次调用exec方法。

 
  1. <script> 
  2. var reg = /\d/g; 
  3. var str = "1"
  4. alert( reg.exec(str) );  //结果是1 
  5. alert( reg.exec(str) );  //结果居然是null!! 没想到吧! 
  6. alert( reg.exec(str) );  //这次又是1了 
  7. </script> 

 2、创建一个正则实例并指明了global全局模式,然后两次作为String.match方法的参数被调用。

 
  1. <script> 
  2.   var reg = /\d/g; 
  3.   var str = "1"
  4.   alert( str.match(reg) );  //结果是1 
  5.   alert( str.match(reg) );  //结果也是1 
  6. </script> 

3、创建一个正则实例并指明了global全局模式,然后两次作为String.search方法的参数被调用。

 
  1. <script> 
  2. var reg = /\d/g; 
  3. var str = "abc1"
  4. alert( str.search(reg) );  //结果是3 
  5. alert( str.search(reg) );  //结果也是3 
  6. </script> 

4、创建一个正则实例并指明了global全局模式,然后两次作为String.replace方法的参数被调用。

 
  1. <script> 
  2. var reg = /\d/g; 
  3. var str = "abc1"
  4. alert( str.replace(reg,"") );  //结果是abc 
  5. alert( str.replace(reg,"") );  //结果也是abc 
  6. </script> 

5、混合调用一下。

 
  1. <script> 
  2. var reg = /\d/g; 
  3. var str = "abc1"
  4. alert( str.replace(reg,"") );  //结果是abc 
  5. alert( reg.test(str) );        //IE:false //others: true 
  6.  
  7. var reg2 = /\d/g; 
  8. var str = "abc1"
  9. alert( str.search(reg2) );   //结果是3 
  10. alert( reg2.test(str) );     //IE:false //others: true 
  11.  
  12. var reg3 = /\d/g; 
  13. var str = "abc1"
  14. alert( str.split(reg3) );   //结果是abc 
  15. alert( reg3.test(str) );    //IE:false //others:true 
  16.  
  17. var reg4 = /\d/g; 
  18. var str = "abc1"
  19. alert( str.match(reg4) );   //结果是1 
  20. alert( reg4.test(str) );    //IE:false //others:true 
  21. </script> 

6、进一步看看IE与其它浏览器的不同。

 
 
  1. <script>  
  2. var reg = /\d*/g;    //注意这里跟上面的示例的不同 
  3. var str = "1"
  4. alert( reg.lastIndex );  //IE: 0       //others: 0 
  5. alert( reg.test(str) );      //IE: true    //others: true 
  6.  
  7. alert( reg.lastIndex );  //IE: 1       //others: 1 
  8. alert( reg.test(str) );      //IE: true    //others: true 
  9.  
  10. alert( reg.lastIndex );  //IE: 2       //others: 1 
  11. alert( reg.test(str) );      //IE: false   //others: true 
  12.  
  13. alert( reg.lastIndex );  //IE: 0       //others: 1 
  14. alert( reg.test(str) );      //IE: true    //others: true 
  15.  
  16. alert( reg.lastIndex );  //IE: 1       //others: 1 
  17. alert( reg.test(str) );      //IE: true    //others: true 
  18.  
  19. alert( reg.lastIndex );  //IE: 2       //others: 1 
  20. alert( reg.test(str) );      //IE: false   //others: true 
  21.  
  22. alert( reg.lastIndex );  //IE: 0       //others: 1 
  23. alert( reg.test(str) );      //IE: true    //others: true 
  24. </script>

有点小复杂,注意这可不是正则表达式的BUG,各位在使用时要多加留心。

 




     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/807948,如需转载请自行联系原作者

相关文章
SQL正则表达式应用:文本数据处理的强大工具——深入探讨数据验证、模式搜索、字符替换等核心功能及性能优化和兼容性问题
【8月更文挑战第31天】SQL正则表达式是数据库管理和应用开发中处理文本数据的强大工具,支持数据验证、模式搜索和字符替换等功能。本文通过问答形式介绍了其基本概念、使用方法及注意事项,帮助读者掌握这一重要技能,提升文本数据处理效率。尽管功能强大,但在不同数据库系统中可能存在兼容性问题,需谨慎使用以优化性能。
110 0
你见过这些正则表达式中奇奇怪怪的匹配模式吗 _ 贪婪匹配、懒惰匹配 、禁止贪婪匹配!
一篇文章让你清楚的了解正则表达式中奇奇怪怪的匹配模式-- 贪婪匹配、懒惰匹配 、禁止贪婪匹配!
108 1
你见过这些正则表达式中奇奇怪怪的匹配模式吗 _ 贪婪匹配、懒惰匹配 、禁止贪婪匹配!
JavaScript中的正则表达式:使用与模式匹配
【4月更文挑战第22天】本文介绍了JavaScript中的正则表达式及其模式匹配,包括字面量和构造函数定义方式,以及`test()`、`match()`、`search()`和`replace()`等匹配方法。正则表达式由元字符(如`.`、`*`、`[]`)和标志(如`g`、`i`)组成,用于定义搜索模式。文中还分享了正则使用的技巧,如模式分解、非捕获分组和注释。掌握正则表达式能提升文本处理的效率和代码质量。
解锁正则表达式的秘密:regex-vis工具带你看见模式匹配的魔法!
解锁正则表达式的秘密:regex-vis工具带你看见模式匹配的魔法!
223 2
Python 自动化指南(繁琐工作自动化)第二版:七、使用正则表达式的模式匹配
Python 自动化指南(繁琐工作自动化)第二版:七、使用正则表达式的模式匹配
126 0
正则表达式中的模式修正符S和M 妙用!
教你如何正确使用正则表达式中的模式修正符S和M!
97 0
正则表达式中的模式修正符S和M 妙用!
正则表达式中的【模式修正符】 完美增强字符串处理的能力!
如果你还没有搞懂模式修饰符是什么?那么你必须要看一下这篇文章!!
85 0
正则表达式中的【模式修正符】 完美增强字符串处理的能力!
【从零学习python 】68. Python正则表达式中的贪婪和非贪婪模式
【从零学习python 】68. Python正则表达式中的贪婪和非贪婪模式
99 2
【从零学习python 】66.深入了解正则表达式:模式匹配与文本处理的利器
【从零学习python 】66.深入了解正则表达式:模式匹配与文本处理的利器
145 2