全局模式下的正则表达式

 2023-09-05 阅读 358 评论 0

摘要:在全局模式(global)下使用正则表达式,有一些需要特别注意的地方,先来看一段有意思的代码: <script> varreg=/\d/g; varstr="1"; alert(reg.test(str)); //应该弹出true alert(reg.test(str)); //应该弹什么呢ÿ

在全局模式(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,如需转载请自行联系原作者

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/258.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息