日期:2014-05-16  浏览次数:20340 次

一个有关正则表达式的问题
请看下面方法:
function   checkTest(){
    var   zz   =   /h[ea]{1,2}d/g;
    alert(zz.test( "heed "));
    alert(zz.test( "head "));
    alert(zz.test( "haad "));
    alert(zz.test( "haed "));
}
输出结果:
true
false
ture
false

请问javascript高手这是为什么?

------解决方案--------------------
function checkTest(){
var zz = /h[ea]{1,2}d/g;
alert(zz.test( "heed "));
zz.compile();
alert(zz.test( "head "));
zz.compile();
alert(zz.test( "haad "));
zz.compile();
alert(zz.test( "haed "));
}
------解决方案--------------------
http://community.csdn.net/Expert/TopicView3.asp?id=5422907

看后面的关于第3点的解释

和g与lastIndex有关,
解决的办法还是上面的:每次调用前在重新编译下
仔细看看下文
http://www.chiqiang.com/logs/2006/11/3785992.html


我把关键的地方烤下来:
1。 假如你的正则表达式使用了 "g "标记,你可以多次使用exec 方法来连续匹配相同的串。当你这样做
的时候,新的匹配将从由正则表达式的lastIndex 属性值确定的子串中开始。(test一样的方法)

2。
RegExp的属性 在javascript 1.2, NES 3.0以上版本提供
描述:lastIndex 是个别的正则表达式对象的属性。 这个属性只有当正则表达式的 "g "标记被使用以进行全串匹配的时候才被设置。实行以下规则:
如果lastIndex大小字符串的长度,regexp.test和regexp.exec失败,且lastIndex被设为0。
如果lastIndex等于字串的长度且正则表达式匹配空字符串,则正则表达式从lastIndex的位置开始匹配。
如果lastIndex等于字符串的长度且正则表达式不匹配空字符串,则正则表达式不匹配input,且lastIndex被置为0。
否则,lastIndex被设置成最近一次匹配的下一点。

举例

var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "aaaaaa "))
alert(bbb.lastIndex)
//var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "中中aa中中 "))
alert(bbb.lastIndex)
//var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "aaa中aa "))
alert(bbb.lastIndex)


这个与上面的区别在于第2个的长度,比6大多了,可以匹配到true
var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "aaaaaa "))
alert(bbb.lastIndex)
//var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "中中aa中中中中中中 "))
alert(bbb.lastIndex)
//var bbb=/[a-z\u4e00-\u9fa5]{2,}/gi
alert(bbb.test( "aaa中aa "))
alert(bbb.lastIndex)