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"));
}

解决方案 »

  1.   

    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)
      

  2.   

    /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,不符合
      

  3.   

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ※以下是引用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"));
      

  4.   

    to 0009(夏天以南) ( ) 信誉:96 --------------------------------------
    以前还真没有注意过这个问题,仔细看了看(铭轩) 的解释现在明白了许多,多谢多谢
    不过我有个想法,对于test方法,应该是验证字符串是否符合某种模式,这样的话,还有必要设置g标志吗?如果没有g标志,则head,或haad就都匹配了
    我觉得是不是只有exec或match的时候才有必要射g标志呢?
      

  5.   

    一般这样的情况,我都是完全match匹配的,把g换成^$就不会有这个问题了
      var zz = /^h[ea]{1,2}d$/;
      

  6.   

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ※以下是引用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/就没问题了。只是这个问题引申出来的一些特性值得研究,这两天没时间工作太忙了。
      

  7.   

    以前写过这么一个正则,用于评判密码强度。
    如果没有输入则 返回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中失效。
      

  8.   

    有一个问题  compile函数到底做了什么试试下面这个
     var re = /^\d+$/;
     var s = "fdsfds";
     re.compile();
     alert(re.test(s))为什么返回true呢
      

  9.   

    解决这个问题最好不要使用compile()方法只要第一次使用以后全部是true