IT技术博客大学习 共学习 共进步

正确使用JS中的正则

风雪之隅 2009-10-29 22:48:19 浏览 2,501 次

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~

建议继续学习

  1. grep 正则表达式选项要记得转义 (阅读 6,445)
  2. 统计最近用过的linux命令 (阅读 6,405)
  3. 正则表达式基础 (阅读 6,163)
  4. 正则表达式的与或非 (阅读 5,744)
  5. 学习Grep,Sed中的正则 (阅读 5,267)
  6. URL正则表达式 (阅读 4,663)
  7. 正则表达式简要入门 (阅读 4,365)
  8. 正则转义符汇总 (阅读 4,322)
  9. 使用Oracle正则表达式监控应用到数据库的连接情况 (阅读 4,267)
  10. PHP 正则里面的两个重要技巧 (阅读 4,262)