Javascript 問題汇总(不定期更新)【一】
一为什么JavaScript中正则表达式的test方法会出错?
http://fdream.net/blog/article/672.aspx
var reg = /[\d]{1,2}:[\d]{1,2}\s*-\s*[\d]{1,2}:[\d]{1,2}/gi;
reg.test("08:00-10:00");//true
reg.test("08:00-10:00");//false
reg.test("08:00-10:00");//true
reg.test("08:00-10:00");//false
何解第二次会为false呢;
其实仔细看一下,那个正则表达式多了个全局选项“g”,去掉就好了。
可是为什么有“g”就会出错呢?
原因其实很简单,当一个模式具有全局选项时,和exec一样,每次test都会保留上次匹配的位置——即lastIndex。很显然,当第一次匹配之后,第二次匹配时的lastIndex已经到了字符串末尾,尽管这个时候字符串已经是一个新的字符串了,但是这个lastIndex的位置并没有重新初始化,所以会从末尾开始匹配——当然会匹配失败了。
解决方案有两种:
- 去掉正则表达式后面的g;
- 每次完成匹配之后重置模式的lastIndex属性;(即例中的reg.lastIndex=0)