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"));
}
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://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)
搞明白这句话的意思就明白了
我来解释解释
g为全局匹配
[ea]为妖魔是e要么是a
{1,2}最少匹配一次最多匹配2次,合起来就是要么为e 1-2次要么为a 1-2次
heed对中间的e匹配了2次,符合
head出现了e和a,不符合
※以下是引用4楼 qf521lx() 在2007-07-17 09:23:34 的发言:
──────────────────────────────────────────
/h[ea]{1,2}d/g;
搞明白这句话的意思就明白了
我来解释解释
g为全局匹配
[ea]为妖魔是e要么是a
{1,2}最少匹配一次最多匹配2次,合起来就是要么为e 1-2次要么为a 1-2次
heed对中间的e匹配了2次,符合
head出现了e和a,不符合
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━你试下
var zz = /h[ea]{1,2}d/g;
alert(zz.test("head"));
alert(zz.test("heed"));
alert(zz.test("haad"));
alert(zz.test("haed"));
以前还真没有注意过这个问题,仔细看了看(铭轩) 的解释现在明白了许多,多谢多谢
不过我有个想法,对于test方法,应该是验证字符串是否符合某种模式,这样的话,还有必要设置g标志吗?如果没有g标志,则head,或haad就都匹配了
我觉得是不是只有exec或match的时候才有必要射g标志呢?
var zz = /^h[ea]{1,2}d$/;
※以下是引用8楼 hbhbhbhbhb1021(天外水火(我要多努力)) 在2007-07-18 10:38:21 的发言:
──────────────────────────────────────────
一般这样的情况,我都是完全match匹配的,把g换成^$就不会有这个问题了
var zz = /^h[ea]{1,2}d$/;
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
在这个问题上,/h[ea]{1,2}d/g的写法在逻辑上确实有问题,如果用/h[ea]{1,2}d/就没问题了。只是这个问题引申出来的一些特性值得研究,这两天没时间工作太忙了。
如果没有输入则 返回0
长度小于6 返回1
长度大于6组合等于2 返回2
长度大于6组合等于3 返回3
长度大于6组合等于4 返回4
五条规则一个正则解决。function Evaluate(word)
{
return word.replace(/^(?:([a-z])|([A-Z])|([0-9])|(.)){7,}|(.)+$/g, "$1$2$3$4$5").length;
}利用的正是IE里正则的特性,这个正则在FF中失效。
var re = /^\d+$/;
var s = "fdsfds";
re.compile();
alert(re.test(s))为什么返回true呢