Press "Enter" to skip to content

正确使用JS中的正则

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~

16 Comments

  1. Imogene
    Imogene November 27, 2019

    Thanks for finally talking about >正确使用JS中的正则 | 风雪之隅 <Liked it!

  2. 人気ブランドコピー
    2017年春夏新作が入荷!
    早くも2017年最新作が入荷激安屋は最高級のブランド スーパーコピー代引き(N品)専門店です!
    高品質のブランド コピー、ブランド コピー 代引商品や情報が満載しています。
    全部の商品は最高な素材と優れた技術で造られて、正規と比べて、品質が同じです!
    当店の商品はすべて最高品質のN品でございます、
    製造工場直営ですので他社に比べて大変お安く、最低価格を提示しております。
    皆様方のご注文をお待ちしております。
    ロレックス デイトジャスト ブランドコピー http://www.giginza.com

  3. lion
    lion July 25, 2015

    也遇到过这个问题,但是不知道什么原因,这样一讲好像更像是一个bug

  4. Anonymous
    Anonymous January 31, 2013

    掉毛

  5. healthy
    healthy April 22, 2012

    大牛,您的文章写的都非常经典啊,很多都是经常被忽略却非常重要的问题,我仔细阅读了好多文章,受教颇深啊~~
    我要学的还很多,努力吧!

  6. jamesanthony
    jamesanthony March 29, 2012

    使用正则的test方法时,不要使用g标识符。。。

  7. sking7
    sking7 October 26, 2011

    在火狐测试好像没有问题。。。。

  8. fy
    fy August 17, 2009

    lastIndex
    This property is an integer that specifies the index at which to start the next match, but is only set if the regular expression uses the ‘g’ flag to specify a global search.

    这个解释开起来爽点·

  9. zhangyufeng
    zhangyufeng August 13, 2009

    最近正在正则,学习……

  10. 雪候鸟
    雪候鸟 August 12, 2009

    @toms img对象有onresizestart/onresizeend俩个事件, 你可以在这俩个事件入手么.

  11. toms
    toms August 11, 2009

    很抱歉在这里问问题哈, 就是我的在线编辑器需要一个这样的功能,它需要能在ie和firefox中控制编辑器中的某张图片是不可缩放的,这个怎么弄啊?

  12. 阿辛
    阿辛 August 10, 2009

    不错

  13. N
    N August 9, 2009

Comments are closed.