msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

09 Aug 09 正确使用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~


分享到:



Related Posts:

Tags: , , ,

14 Responses to “正确使用JS中的正则”

  1. ロレックス デイトジャスト ブランドコピー |

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

  2. lion |

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

  3. Anonymous |

    掉毛

  4. healthy |

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

  5. jamesanthony |

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

  6. sking7 |

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

  7. fy |

    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.


    这个解释开起来爽点·

  8. MoXie |

    呃~竟然被人夸了-_-#
    —–邪恶的分割线—–
    @toms
    关键词: img resize disable

    Firefox – designMode: disable image resizing handles

    http://stackoverflow.com/questions/289433/firefox-designmode-disable-image-resizing-handles

    Disabling image resize in RadEditor Classic and Prometheus

    http://www.telerik.com/support/kb/aspnet-ajax/editor/disabling-image-resize-in-radeditor-classic-and-prometheus.aspx

  9. 商业创业实验室 |

    moxie同学有成为好程序员的潜质~~~~

  10. zhangyufeng |

    最近正在正则,学习……

  11. 雪候鸟 |

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

  12. toms |

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

  13. 阿辛 |

    不错

  14. N |

Leave a Reply

*