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

Nil*_*kar 12 javascript regex jquery

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>
Run Code Online (Sandbox Code Playgroud)

HTML:

<input type="text" id="TestTextbox"  />
<input type="button" value="Test" onclick="checkNonWordChars();" />
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*der 13

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

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

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


sai*_*iuc 7

选项1

使用构造函数而不是文字表示法:

var reg = new RegExp('[^\w]','gi');
Run Code Online (Sandbox Code Playgroud)

更多关于这两者之间的差异:https://developer.mozilla.org/en-US/docs/Core_JavaScript_1.5_Guide/Regular_Expressions?redirect = no

方案2

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

var reg = /[^\w$]/gi;
Run Code Online (Sandbox Code Playgroud)

方案3

如果正则表达式使用"g"标志,则可以exec多次使用该方法在同一字符串中查找连续匹配.当你这样做时,搜索在开始substringstr由正则表达式的指定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标志.