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

Javascript 限制特殊字符的正则表达式,javascript,regex,Javascript,Regex,我的表单中有一个地址字段,我想限制*\\:[]{}\()”@&$ 我试过使用 var nospecial=/^[^* | \ " : < > [ ] { } ` \ ( ) '' ; @ & $]+$/; if(address.match(nospecial)){ alert('Special characters like * | \ " : < > [ ] { } ` \ ( ) \'\' ; @ &am

我的表单中有一个地址字段,我想限制
*\\:<>[]{}\()”@&$

我试过使用

var nospecial=/^[^* | \ " : < > [ ] { } ` \ ( ) '' ; @ & $]+$/;
            if(address.match(nospecial)){
                alert('Special characters like * | \ " : < > [ ] { } ` \ ( ) \'\' ; @ & $ are not allowed');
                return false;
var nospecial=/^[^*.\\”:<>[]{}`\()”;@&$]+$/;
if(地址匹配(非特殊)){
警报(“不允许使用特殊字符,如*|\”:<>[]{}`\()\'\';@&$);
返回false;

但它不起作用。请告诉我我遗漏了什么?

您需要在角色类中转义结束括号(以及反斜杠)。您也不需要所有空格:

var nospecial=/^[^*|\":<>[\]{}`\\()';@&$]+$/;
使用以下功能

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;
}
函数checkSpcialChar(事件){
如果(!((event.keyCode>=65)和&(event.keyCode=97)和&(event.keyCode=48)和&(event.keyCode/$&+,:;=?[]@#|{}.^*()%!-/]/

下面不允许输入这些字符,它将返回空白

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

在角色中转义
]
class@Juhana-错误。请注意,
^
作为类的第一个字符;这否定了匹配的意义。如果整个地址只有与任何(剩余)字符都不匹配的字符,则它将匹配类中的字符。@TedHopp oops,你是对的!虽然if子句是错误的,但如果正则表达式匹配,它会给出错误消息…@Juhana-你关于
if
的说法是对的!我没有注意到。另外,更好的解决方案是针对单个错误字符进行测试:
if(/[*|等等]/.test(address))警报(“不允许!”)
@fab-为什么更好?我不认为这样或那样会对性能有任何好处。在这两种情况下,匹配都会检查每个字符,针对类进行测试,直到找到匹配项或字符串结尾。此外,您的建议需要单独的测试来排除空地址字符串。@fab-好吧,我收回它。Evid你的方法更快(至少在Chrome浏览器中),至少根据(即使对空字符串进行额外的测试)。我不知道为什么会这样(除非JS引擎多线程在我的多核pc上匹配,这是完全可能的)。为了解释性能差异:对于表达式,在字符串结尾之前找不到匹配项,因为它以
$
结尾。从技术上讲,它必须跟踪整个字符串并测试每个字符,而我的表达式则逐字符检查,不进行回溯,并在第一个特殊字符处退出,因为
 test()
只检查表达式是否匹配,而
match()
查找所有匹配项。@fab-回溯是有意义的,这可能解释了差异。但是,它不需要一直到字符串末尾就失败了;一旦它找到不匹配的字符,就有理由回溯,但没有理由继续。
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;
}
.replace(/[$&+,:;=?[\]@#|{}'<>.^*()%!-/]/,"");