正确使用JS中的正则(转)


原文地址:http://www.laruence.com/2009/08/09/1036.html
yuchen网友发来一个问题, 大体意思就是在JS中, 同样的正则, 同样的字符串, 循环匹配结果却不一样 ,

<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>

this works well too~


世界不可能那么远