Javascript正则表达式应该传递.test()但似乎失败了 – 为什么?

在javascript中测试我的正则表达式时,我似乎得到了一个奇怪的结果。

这是我的小提琴: http : //jsfiddle.net/s5fYf/15/

这是从我正在构建的Web项目中获取的。 我将validation对象数组传递给我的validation函数,validation函数遍历它们,根据值validation每个规则。 如果一个是假的,它应该停止循环并返回一个返回对象,该对象从失败的规则中获取消息和cssClass。

问题是即使正则表达式测试通过,validation方法似乎也返回false,这应该是不可能的! 所以我觉得我错过了一些关键的东西。 从调试输出中可以看到输出的正则表达式测试通过,但在代码中测试时显然会失败。 这与我在项目中看到的内容一致,如果省略调试输出,返回值基本上在true和false之间切换。

基本上/regex/.test(value)函数似乎在true和false之间振荡,这是一致的,但不是我所期待的……所以,我的问题是导致这种奇怪行为的原因!?

我已经在解决方案之外测试了我的正则表达式,据我所知它可行。

更新:

从我的正则表达式中省略’g’或全局标志解决了这个问题。

请参阅下面的答案,然后单击此链接以获取有关全局标志及其缺陷的完整说明:

为什么在Javascript中使用全局标志的RegExp会给出错误的结果?

归结为javascript正则表达式的test方法返回结果并在匹配后移动指针。

所以第一个调用返回true,然后第二个调用返回false。 查看此示例: http : //jsfiddle.net/B9aVA/

 var regex = /^.+$/g var input = "Hello"; console.log(regex.test(input)); console.log(regex.test(input)); 

 true false 

所以你的代码调用了两次测试:

 case "regex": $(".debug-info").append('Result: ' + validation[i].rule.test(value) + '
'); if (!validation[i].rule.test(value)) returnValue.isValid = false; break;

我的建议是调用一次test并将结果存储在变量中,然后使用它

 case "regex": var result = validation[i].rule.test(value); $(".debug-info").append('Result: ' + result + '
'); if (!result) returnValue.isValid = false; break;

故事的道德:方法可以产生副作用,这就是它们与属性的区别。