Javascript正则表达式第一次工作正常,但不是第二次,第三次再次工作,而不是第四次,等等:(
脚本:
<script language="javascript" type="text/javascript">
var reg = /[^\w]/gi;
function checkNonWordChars() {
var str = $("#TestTextbox").val();
if (reg.test(str)) {
alert('!!! Non-Word Char Exists !!!');
}
else {
alert('input accepted');
}
}
</script>
HTML:
<input type="text" id="TestTextbox" />
<input type="button" value="Test" onclick="checkNonWordChars();" />
如果我点击按钮一次,它会发出警告说“!!!非Word Char存在!!!“但是如果我再次点击它,它会发出警告说”输入被接受“:(
答案 0 :(得分:12)
我怀疑它与使用g
修饰符makes the engine remember its state的事实有关。
尝试删除g
修饰符,无论如何都不需要它。引擎总是会尝试在整个字符串中找到匹配项。因此,g
修饰符实际上并没有与test
函数结合使用,而是用于match
。顺便说一下,您也不需要i
修饰符,因为\w
包括小写和大写字母。
最后一件事。正则表达式提供方便的\W
,与\w
相反,因此相当于[^\w]
。
答案 1 :(得分:7)
选项1
使用构造函数而不是文字符号:
var reg = new RegExp('[^\w]','gi');
更多关于这两者之间的差异:https://developer.mozilla.org/en-US/docs/Core_JavaScript_1.5_Guide/Regular_Expressions?redirect=no
选项2
使用$
符号标记字符串的结尾:
var reg = /[^\w$]/gi;
选项3
如果正则表达式使用“g”标志,则可以多次使用exec
方法在同一字符串中查找连续匹配。执行此操作时,搜索从正则表达式substring
属性指定的str
lastIndex
开始
(test
也将推进lastIndex属性。)
来源:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec
因此,在您的情况下,测试仅适用于第1,第3,第5 ......时间。
仅在Firefox 3中有一个标记y
,当指定exec
时始终从0开始而不是lastIndex
,但这可能对您的情况没有用。
您可以删除g
标记。
答案 2 :(得分:1)
似乎RegExp对象并不像我们想象的那样无状态。
快速解决方法是在var reg = /[^\w]/gi;
方法
checkNonWordChars()
最诚挚的问候,
答案 3 :(得分:0)
如果您需要将该正则表达式设为全局,请将其更改为:
var reg = /[^\w]/
它也会起作用,但不是马车!它也会更快,因为它只需要检查一个顽皮角色的一个实例,而你不关心带有非单词字符的字符大小写。