4

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

var value = userInput;
var pattern = /[^A-z0-9 "!&,'\-]/;
if(patt.test(value) == true) then do something

它工作正常,排除了我不希望用户输入的字母,方括号和插入符号除外。从我读过的所有 javascript 正则表达式教程中,它们都是特殊字符 - 括号表示它们之间的任何字符,而在这种情况下插入符号表示不在方括号之间的任何字符。我在这里和谷歌上搜索了关于为什么这些字符也被接受但找不到解释的解释。

那么任何人都可以帮忙,为什么我的输入接受方括号和插入符号?

4

4 回答 4

7

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

于 2013-09-06T16:21:54.123 回答
3

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

我想接受任何字母数字字符、空格和以下 !&,'\- 可能还有一些我会在以后添加的

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

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

笔记:

  1. A-z还包括字符:

    [\]^_`
    .

    使用A-Za-z或使用i修饰符仅匹配字母:

     var pattern = /^[a-z0-9 "!&,'\\-]+$/i;
    
  2. \-只是字符-,因为反斜杠将充当转义的特殊字符。用于\\允许反斜杠。

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

  4. +在字符类之后使用以匹配多个字符。


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

于 2013-09-06T16:02:00.593 回答
0

我不确定你想要什么,但我不认为你当前的正则表达式做你认为它做的事情:

它试图找到一个字符不是A-z0-9 "!&,'\-^表示not)。

另外,我什至不确定什么A-z匹配。要么a-z要么A-Z

所以你当前的正则表达式匹配字符串".""Hi."但不是"Hi"

于 2013-09-06T15:49:38.827 回答
0

尝试这个:var pattern = /[^\w"!&,'\\-]/;

注意: \w 还包括_,所以如果你想避免这种情况,请尝试

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

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

于 2013-09-06T15:53:37.980 回答