Javascript Regular Expression第一次工作正常,但不是第二次,第三次工作,而不是第四次,依此类推

时间:2012-11-05 14:00:28

标签: javascript jquery regex

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存在!!!“但是如果我再次点击它,它会发出警告说”输入被接受“:(

4 个答案:

答案 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]/

它也会起作用,但不是马车!它也会更快,因为它只需要检查一个顽皮角色的一个实例,而你不关心带有非单词字符的字符大小写。