代码改变世界

javascript 正则中的一个易错点

2012-09-22 20:26  youxin  阅读(249)  评论(0编辑  收藏  举报

转自:http://www.laruence.com/2009/08/09/1036.html

 在下面例子中,同样的正则, 同样的字符串, 循环匹配结果却不一样 ,

<script type='text/javascript'>
var reTest = /^aid=(.*)/ig;
 
var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
 
for (var i=0, l=aData.length; i<l; i++) {
     alert(reTest.test(aData[i]));
}
</script>

输出:

true false true false;

为什么会这样呢? 这个就和JS中正则对象的lastIndex属性有关了

定义和用法

lastIndex 属性用于规定下次匹配的起始位置。
语法

Js代码
RegExpObject.lastIndex

说明

该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置
上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本
该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

提示和注释

重要事项:不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性
提示:如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0

So, 原因很明显, 解决方法也很明了了.

<script type='text/javascript'>
var reTest = /^aid=(.*)/ig;
 
var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
 
for (var i=0, l=aData.length; i<l; i++) {
        reTest.lastIndex = 0;
     alert(reTest.test(aData[i]));
}
</script>

 

另外, moxie同学说的方法其实更有效, 既然你不需要g, 那何必设置g呢?

<script type='text/javascript'>
var reTest = /^aid=(.*)/i;
 
var aData = [ 'aid=^$', 'aid=^$', 'aid=^$', 'aid=^$' ]; 
 
for (var i=0, l=aData.length; i<l; i++) {
     alert(reTest.test(aData[i]));
}
</script>

也可以正常工作。