IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

正确使用JS中的正则

风雪之隅 2009-10-29 22:48:19 累计浏览 2,577 次
本机暂存

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. translateZ() (2026-06-25 21:18:56)
  2. translateY() (2026-06-25 21:17:56)
  3. translateX() (2026-06-25 21:16:01)

查看更多 前端 文章 →

建议继续学习

  1. JQuery实现Excel表格呈现 (累计阅读 48,349)
  2. vim几个小技巧(批量替换,列编辑) (累计阅读 37,517)
  3. 深入理解Javascript之执行上下文(Execution Context) (累计阅读 18,404)
  4. 我的 Sublime Text 2 笔记 (累计阅读 16,729)
  5. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  6. 图片动态局部毛玻璃模糊效果的实现 (累计阅读 14,849)
  7. 天朝第二代身份证号码的验证机制 (累计阅读 14,762)
  8. HTML 5 的data-* 自定义属性 (累计阅读 14,349)
  9. 分享一个JQUERY颜色选择插件 (累计阅读 14,223)
  10. 什么是全栈工程师? (累计阅读 14,038)