Javascript正则表达式第一次运行正常,但第二次运行正常,第三次运行正常,第四次运行正常,以此类推

Javascript正则表达式第一次运行正常,但第二次运行正常,第三次运行正常,第四次运行正常,以此类推,javascript,jquery,regex,Javascript,Jquery,Regex,Javascript正则表达式第一次运行正常,但第二次运行正常,第三次运行正常,第四次运行正常,依此类推:( 脚本: <script language="javascript" type="text/javascript"> var reg = /[^\w]/gi; function checkNonWordChars() { var str = $("#TestTextbox").val(); if (reg.test(str)) {

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>

var reg=/[^\w]/gi;
函数checkNonWordChars(){
var str=$(“#TestTextbox”).val();
if(注册测试(str)){
警报(“!!!存在非单词字符!!!”);
}
否则{
警报(“接受输入”);
}
}    
HTML:

<input type="text" id="TestTextbox"  />
<input type="button" value="Test" onclick="checkNonWordChars();" />


如果我单击一次按钮,它将发出一个警告,说“!!!非单词字符存在!!!”,但如果我再次单击它,它将发出一个警告,说“输入已接受”:(

我怀疑这与使用
g
修饰符有关

尝试删除
g
修饰符,您无论如何都不需要它。引擎将始终尝试在整个字符串中查找匹配项。因此,
g
修饰符与
test
函数组合使用时实际上不做任何事情,而是用于
match
。用户也不需要
i
修饰符方式,因为
\w
包括小写和大写字母


最后一点,正则表达式提供了方便的
\W
,它与
\W
相反,因此相当于
[^\W]

似乎RegExp对象并不像我们想象的那样是无状态的。 快速修复方法是将
var reg=/[^\w]/gi;
移动到
checkNonWordChars()方法中


致以最诚挚的问候,选项1

使用构造函数而不是文字符号:

var reg = new RegExp('[^\w]','gi');
关于两者之间的差异,请参见:

选项2

$
符号标记字符串的结尾:

var reg = /[^\w$]/gi;
选项3

如果正则表达式使用“g”标志,则可以多次使用
exec
方法查找同一字符串中的连续匹配项。执行此操作时,搜索将从正则表达式的
lastIndex
属性指定的
str
子字符串开始
(
test
还将提升lastIndex属性)

资料来源:

因此,在您的情况下,测试将只在第1、第3、第5……次工作

只有在Firefox3中才有一个标志
y
,当指定
exec
时,它总是从0开始,而不是从
lastIndex
开始,但这在您的情况下可能没有用


您可以删除
g
标志。

如果需要该regex全局,则将其更改为:

var reg = /[^\w]/

它也能正常工作,但不会出现bug!它也会更快,因为它只需要检查一个顽皮角色的实例,而且你不关心非单词字符的大小写。

你在该文本框上有模糊/更改/聚焦处理程序吗?是的,你是对的,在这个ca中我不需要
g
I
但这只是我测试的示例,因为我的原始正则表达式不起作用。我有类似于
/[^a-d^0-3\$\-]/gi
和其他需要
g
i
@NileshThakkar的人如果将它们与
test
一起使用,为什么需要
g
?请先阅读我的答案,然后使用构造函数而不是文字符号:
var reg=new RegExp('[^\w]',gi'));
使用构造函数…为什么?如果你解释它背后的原因,好的建议甚至更好。我用构造函数得到了它,谢谢@RoManiac&Stijn de WittYes,这是一个快速修复方法,但当我多次使用同一个表达式时,这是一个坏主意。或者,如果表达式在脚本中的不同位置使用,而你不会ant要创建1001个RegExp实例,
reg.compile(reg)
可能会工作,尽管
compile
被认为是不推荐的。选项1工作正常,而不是选项2,无论如何,感谢您的帖子。选项2中的正则表达式是错误的。您只是将“$”字符添加到字符类中,您需要
var reg=/[^\w]$/gi;
。但无论如何,我认为这不是OP想要的,它只会检查字符串中的最后一个字符是否为非单词字符。