我想在使用javascript正则表达式时忽略方括号

我想在使用javascript正则表达式时忽略方括号,javascript,regex,Javascript,Regex,我正在使用javascript正则表达式进行一些数据验证,并指定我想要接受的字符(我想要接受任何字母数字字符、空格和下面的!&,'\-,如果需要的话,可能还会再加上一些)。我的代码是: var value = userInput; var pattern = /[^A-z0-9 "!&,'\-]/; if(patt.test(value) == true) then do something 它工作正常,排除了我不希望用户输入的字母,除了方括号和插入符号。从我读过的所有javascri

我正在使用javascript正则表达式进行一些数据验证,并指定我想要接受的字符(我想要接受任何字母数字字符、空格和下面的
!&,'\-
,如果需要的话,可能还会再加上一些)。我的代码是:

var value = userInput;
var pattern = /[^A-z0-9 "!&,'\-]/;
if(patt.test(value) == true) then do something
它工作正常,排除了我不希望用户输入的字母,除了方括号和插入符号。从我读过的所有javascript正则表达式教程中,它们都是特殊字符——括号表示它们之间的任何字符,在本例中,插入符号表示不在方括号之间的任何字符。我在这里和谷歌上搜索了关于为什么这些字符也被接受的解释,但找不到解释


有人能帮忙吗,为什么我的输入接受方括号和插入符号?

我不确定你想要什么,但我不认为你当前的regexp做了你认为它做的事情:

它试图找到一个字符不是
A-z0-9”!&,\-
^
表示
不是

另外,我甚至不确定A-z与
A-z
匹配的是什么。要么是
A-z
,要么是
A-z


因此,您当前的regexp匹配字符串,如
“Hi”。
但不匹配
“Hi”

尝试以下操作:
var模式=/[^\w”!&,\\-]/

注意:\w还包括
,因此如果您想避免这种情况,请尝试

var pattern = /[^a-z0-9"!&,'\\-]/i;

我认为正则表达式的问题在于A-z被理解为0x41(65)和0x7A(122)之间的所有字符,其中包括A-z和A-z之间的字符[]^`。(Z是0x5A(90),a是0x61(97),这意味着前面的字符占用0x5B到0x60)。

您的正则表达式与您所说的不一致:

我想接受任何字母数字字符、空格和以下内容!&,'\-如果需要的话,我以后会补充一些

如果只接受这些字符,则需要删除插入符号:

var pattern = /^[A-Za-z0-9 "!&,'\\-]+$/;
注:

  • A-z
    还包括以下字符: [\]^_`
  • \-
    只是字符
    -
    ,因为反斜杠将充当转义的特殊字符。使用
    \\
    允许使用反斜杠

  • ^
    $
    是锚定,用于匹配字符串的开头和结尾。这确保整个字符串与正则表达式匹配

  • +
    在字符类之后用于匹配多个字符



  • 如果您的意思是希望匹配除您接受的字符以外的字符,并使用它来防止用户输入“禁止”字符,那么上面的第一个注释描述了您的问题。使用
    A-Za-z
    而不是
    A-z
    (第二个注释也是相关的)。

    原因是您使用的是A-z而不是A-Za-z。Z(0x5a)和a(0x61)之间的ascii范围包括方括号、插入符号、反引号和下划线。

    您的意思是要将方括号作为无效字符进行验证?我认为不需要+字符(也不需要锚),因为他使用的是测试方法,该方法只检查是否存在匹配。@Alex是的,后来我才意识到这一点,这就是为什么我在回答中添加了第二部分。我留下了第一部分,除了使用
    .match()
    方法外,它做了同样的事情。太好了,谢谢你的解释,它很有魅力!
     var pattern = /^[a-z0-9 "!&,'\\-]+$/i;