限制特殊字符的正则表达式

4

我在表单中有一个地址字段,我想限制输入以下特殊字符:
* | \ " : < > [ ] { } \ ( ) '' ; @ & $
我已经尝试使用以下方法来实现:

var nospecial=/^[^* | \ " : < > [ ] { } ` \ ( ) '' ; @ & $]+$/;
            if(address.match(nospecial)){
                alert('Special characters like * | \ " : < > [ ] { } ` \ ( ) \'\' ; @ & $ are not allowed');
                return false;

但是它没有起作用。请告诉我错过了什么?


在您的字符类中转义] - Fabian Schmengler
1
@Juhana - 错了。 注意^作为类的第一个字符; 它否定了匹配的意义。 只有当整个地址中的所有字符都不匹配类中的(剩余)字符时,它才会匹配。 - Ted Hopp
@TedHopp 哎呀,你说得对!不过这样 if 子句就有问题了,如果正则表达式匹配成功,它会显示错误信息... - JJJ
@Juhana - 你说的 if 是对的!我没注意到。 - Ted Hopp
4个回答

16
你需要转义字符类中的右括号(以及反斜杠)。你也不需要所有的空格:
var nospecial=/^[^*|\":<>[\]{}`\\()';@&$]+$/;

我去除了你所有的空格;如果你也想限制空格字符,那就重新加入一个空格。

编辑 如@fab在评论中指出的,反转正则表达式的含义会更有效率:

var specials=/[*|\":<>[\]{}`\\()';@&$]/;

测试是否存在特殊字符(而不是不存在特殊字符):

if (specials.test(address)) { /* bad address */ }

2
另外,更好的解决方案是针对单个不良字符进行测试if (/[*|and-so-on]/.test(address)) alert('not allowed!'); - Fabian Schmengler
@fab - 为什么更好?我不认为有任何一种方式会带来性能上的好处。在任何情况下,匹配都会查看每个字符,针对类进行测试,直到找到匹配项或字符串结束。此外,您的建议需要进行单独的测试以排除空地址字符串。 - Ted Hopp
@fab - 好吧,我收回之前的话。显然你的方法更快(至少在Chrome浏览器中),至少根据这个测试(即使有额外的空字符串测试)。我不知道为什么会这样(除非JS引擎在我的多核PC上多线程匹配,这是完全可能的)。 - Ted Hopp
为了解释性能差异:使用您的表达式,由于字符串以 $ 结尾,因此在字符串结尾之前找不到匹配项。从技术上讲,它必须回溯整个字符串并测试每个字符,而我的表达式逐个字符地检查,遇到第一个特殊字符就退出,因为 test()检查表达式是否匹配,而 match() 查找所有匹配项。 - Fabian Schmengler
@fab - 回溯很有道理,这可能解释了差异。但是,它不需要到达字符串的末尾才能失败;一旦找到无法匹配的字符,就有回溯的理由,但没有继续进行的理由。 - Ted Hopp
你是对的,我混淆了匹配和失败。如果在字符串中找到一个特殊字符,两个表达式都会结束,如果没有特殊字符,则会一直继续到字符串末尾。 - Fabian Schmengler

3

/[$&+,:;=?[]@#|{}'<>.^*()%!-/]/

以下字符禁止输入,输入时将返回空格。

.replace(/[$&+,:;=?[\]@#|{}'<>.^*()%!-/]/,"");

0
请使用下面的函数。
function checkSpcialChar(event){
    if(!((event.keyCode >= 65) && (event.keyCode <= 90) || (event.keyCode >= 97) && (event.keyCode <= 122) || (event.keyCode >= 48) && (event.keyCode <= 57))){
        event.returnValue = false;
        return;
    }
    event.returnValue = true;
}

0

使用这个,它会解决问题。

String patttern = r"[!-/:-@[-`{-~]";

RegExp regExp = RegExp(patttern);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接