14

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();" />

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

4

4 回答 4

16

我怀疑这与使用g修饰符使引擎记住其状态这一事实有关。

尝试删除g修饰符,无论如何您都不需要它。引擎将始终尝试在整个字符串中找到匹配项。因此,g修饰符实际上并没有与test函数一起做任何事情,而是用于match. 顺便说一下,您也不需要i修饰符,因为 \w它包括小写和大写字母。

最后一件事。正则表达式提供了\W相反的方便,\w因此等同于[^\w].

于 2012-11-05T14:07:39.833 回答
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多次使用该方法在同一字符串中查找连续匹配项。当您这样做时,搜索从正则表达式的属性指定的substringof开始(也将推进 lastIndex 属性)。strlastIndextest

来源:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec

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

只有在 Firefox 3 中有一个标志y,当指定时exec总是从 0 开始,lastIndex但在你的情况下这可能没有用。

您可以删除g标志。

于 2012-11-05T14:27:08.373 回答
1

看来RegExp对象并没有我们想象的那么无状态。快速解决方法是在方法var reg = /[^\w]/gi;内部移动checkNonWordChars()

最好的祝福,

于 2012-11-05T14:11:36.727 回答
0

如果您需要将该正则表达式设为全局,请将其更改为:

var reg = /[^\w]/

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

于 2012-11-05T14:29:39.633 回答