在 JavaScript 中测试我的正则表达式时,我似乎得到了一个始终奇怪的结果。
这是我的小提琴:http://jsfiddle.net/s5fYf/15/ http://jsfiddle.net/s5fYf/15/
这是取自我正在构建的一个网络项目。我将验证对象数组传递到验证函数中,该函数会迭代它们,根据值验证每个规则。如果为 false,则应停止循环并返回一个返回对象,该对象从失败的规则中获取消息和 cssClass。
问题是即使正则表达式测试通过,验证方法似乎也会返回 false,这应该是不可能的!所以我觉得我错过了一些关键的东西。从调试输出中,您可以看到输出的正则表达式测试通过了,但在代码中测试时显然失败了。这与我在项目中看到的内容一致,如果我省略调试输出,返回值基本上会在 true 和 false 之间切换。
本质上是/regex/.test(value)
函数似乎在 true 和 false 之间振荡,这是一致的,但不是我所期望的......所以,我的问题是是什么导致了这种奇怪的行为!?
我已经在解决方案之外测试了我的正则表达式,据我所知它有效。
UPDATE:
从我的正则表达式中省略“g”或全局标志解决了这个问题。
请参阅下面的答案,然后查看此链接以获取全局标志及其陷阱的完整说明:
为什么 Javascript 中带有全局标志的 RegExp 会给出错误的结果? https://stackoverflow.com/questions/1520800/why-regexp-with-global-flag-in-javascript-give-wrong-results
归根结底是这样一个事实:test
javascript 正则表达式的方法返回结果并将指针移至匹配项之后。
所以第一个调用返回 true,然后第二个返回 false。检查这个例子:http://jsfiddle.net/B9aVA/ http://jsfiddle.net/B9aVA/
var regex = /^.+$/g
var input = "Hello";
console.log(regex.test(input));
console.log(regex.test(input));
Writes
true
false
所以你的代码调用 test 两次:
case "regex":
$(".debug-info").append('<span>Result: ' + validation[i].rule.test(value) + '</span><br />');
if (!validation[i].rule.test(value))
returnValue.isValid = false;
break;
我的建议是打电话test
一次并将结果存储在变量中,然后使用它
case "regex":
var result = validation[i].rule.test(value);
$(".debug-info").append('<span>Result: ' + result + '</span><br />');
if (!result)
returnValue.isValid = false;
break;
这个故事的寓意是:方法可能有副作用,这就是它们与属性的区别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)