现有以下两行代码:
var r = new RegExp("\\s+","g");
alert(r.test(document.getElementsByName("username")[0].value));
alert(r.test(document.getElementsByName("password")[0].value));
用正则匹配结果,经测试:alert(r.test(document.getElementsByName("username")[0].value));   true
alert(r.test(document.getElementsByName("password")[0].value));    falseusername是一个普通文本框,password是一个密码框
这两行代码我在外面经过滤过,所以执行这两行代码时候,已经能保证两个框都不为空,全部有值,
但是可能还含有空白字符
所以我才用正则来匹配的想再过滤的,但是这里出问题了,其他输入情况,判断结果都正常!
就是输入" 4"(第一个为空格,就两个字符或者" 5" " 6")的时候,出问题了
文本框的结果为true,密码框为false
我两个框都输入一模一样的,而也是用一样的正则表达式,为什么结果会不一样?而且我觉得我那个正则可以匹配像" 4"这样的结构啊

解决方案 »

  1.   

    不知,但猜测是password引发的,试试把两个都换成text
      

  2.   

    先看看alert(document.getElementsByName("password")[0].value); 
      

  3.   

    问题要简化,这样测试:
    var r = /\s+/g;
    var s1 = " 4";
    var s2 = " 4";
    alert(r.test(s1)); // true
    alert(r.test(s2)); // false var r = /\s+/;
    alert(r.test(s1)); // true
    alert(r.test(s2)); // true 结论就是受到"g"标记影响
      

  4.   

    我已经alert过了,都是一模一样的值..
    狂晕!
      

  5.   

    var r1 = /\s+/g;
    var r2 = /\s+/g;
    var s1 = " 4";
    var s2 = " 4";
    alert(r1.test(s1)); // true
    alert(r2.test(s2)); // true
      

  6.   

    正则连续匹配的问题,两次连续调用 r.test 就会出问题!
      

  7.   

    这个一点都不奇怪alert出来一样实际不一样,
    文本框 里的字符串与你写在程序的字符串不一样的,程序里需要需要转义,看看这个帖子
    http://topic.csdn.net/u/20091029/18/00f29281-f45d-4c1c-b604-53c5eb01a7ae.html
      

  8.   

    var r = /\s+/g;
    var s1 = " 4";
    var s2 = " 4";
    alert(r.test(s1)); // true
    r.lastIndex = 0;
    alert(r.test(s2)); // true
      

  9.   

    顶!参见:EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )
    lastIndex考慮以下代碼:<script type="text/javascript">var r = /\d/g;alert(r.test('abc1'));
    alert(r.lastIndex);alert(r.test('ab1'));
    alert(r.lastIndex);alert(r.test('a1'));
    alert(r.lastIndex);</script>lastIndex屬于實例屬性當一個正則表達式實例多次test或exec時,它的lastIndex將每一次都被更改。
      

  10.   

    小弟我快穷死了,所以才拿20分出来实在是很抱歉!呵呵,在此非常感谢楼上所有热心的朋友!!!特别是zswang,谢谢!!!问题已解决,现在总结下:
    现有一例子代码,感觉很简单。不过后来一运行结果却是令人吃惊,代码如下:var data=["id=html","id=head","id=body","id=div","id=em"];var reg=/id=.*/g;for(var i=0,length=data.length;i<length;i++){  alert(reg.test(data[i]));  }理想的结果应该是:true,true,true,true,true。实际结果是:true,false,true,false,true。 之所以出现这种结果是因为正则表达式包含了全局标志g,当一个具有全局标志g的正则表达式调用test()方法时,它的行为和exec()方法相同,即它从lastIndex处开始检索特定的字符串,如果它发现匹配,就将lastIndex设置为紧接在那个匹配之后的位置。RegExp的lastIndex属性的初始值为-1,所以当匹配data[0]时,返回true,此时lastIndex=7,所以匹配data[2]时失败,返回false。匹配失败后lastIndex被重置为-1,所以匹配data[3]时返回true。可以运行以下代码进行验证:
    (function(){  var data=["id=html","id=head","id=body","id=div","id=em"];  var reg=/id=.*/g;  for(var i=0,length=data.length;i<length;i++){    alert(reg.test(data[i]));    alert(RegExp.lastIndex);    }})();
    说明:lastIndex 属性是基于零的,也就是说,第一个字符的索引是零。其初始值为 -1,不论何时产生一个成功匹配,它的值都被修改。lastIndex 属性被 RegExp 对象的 exec 和 test 方法,以及 String 对象的 match、replace、和 split 方法修改。下面的规则应用于 lastIndex 的值: 如果还没有匹配,则 lastIndex 被设置为 -1. 
    如果 lastIndex 比字符串的长度大,则 test 和 exec 失败,并且 lastIndex 被设置为 -1。 
    如果 lastIndex 等于字符串的长度,且模式与空字符串匹配,则正则表达式匹配。否则,匹配失败并且 lastIndex 被重置为 -1。 
    否则,lastIndex 被设置为紧接最近的匹配的下一个位置。 
    null 
      

  11.   

    创建 RegExp 对象的语法:
    new RegExp(pattern, attributes);参数
    参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。这是W3C上对该对象的说明
    var r = new RegExp("\\s+","g"); 这种实例化,貌似只能用一次。
    var r = new RegExp("\\s+","g"); 
    alert(r.test(document.getElementsByName("username")[0].value)); 
    r = new RegExp("\\s+","g"); 
    alert(r.test(document.getElementsByName("password")[0].value)); 
    用一次,重新实例化一下,就没问题了。或者省略全局参数,这样var r = new RegExp("\\s+"); 也是可以的