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

一个奇怪的正则问题
<script>
var   Ux   =   [ 'aa ', 'bb ', 'cc ', 'dd ', 'ee ', 'ff ', 'gg ', 'hh ', 'ii ', 'ab '];
var   re   =   /^[\s\S]*/gi;
for   (var   r   =   0;   r   <   Ux.length   ;r++   ){
alert(re   +   '\n '+ ' " '   +   Ux[r]   +   ' "\n '   +   re.test(Ux[r]));   //   这里的   re.test   结果为   true
alert(re   +   '\n '+ ' " '   +   Ux[r]   +   ' "\n '   +   re.test(Ux[r]));   //   这里的   re.test   结果为   false
}
</script>

为什么同样的语句,两次的结果会不同?

------解决方案--------------------
<script>
var Ux = [ 'aa ', 'bb ', 'cc ', 'dd ', 'ee ', 'ff ', 'gg ', 'hh ', 'ii ', 'ab '];
var re = /^[\s\S]*/gi;
for (var r = 0; r < Ux.length ;r++ ){

alert(re + '\n '+ ' " ' + Ux[r] + ' "\n ' + re.test(Ux[r])); // 这里的 re.test 结果为 true
re.compile();
alert(re + '\n '+ ' " ' + Ux[r] + ' "\n ' + re.test(Ux[r])); // 这里的 re.test 结果为 false
}
</script>
------解决方案--------------------
用^ $代替g就可以了

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)


用ie打开