我正在使用javascript正则表达式进行一些数据验证并指定我想接受的字符(我想接受任何字母数字字符,空格和以下!&,'\-
以及我可能会添加的更多内容以后如果需要)。我的代码是:
var value = userInput;
var pattern = /[^A-z0-9 "!&,'\-]/;
if(patt.test(value) == true) then do something
它工作正常并且排除了我不希望用户输入的字母,除了方括号和插入符号。从我读过的所有javascript正则表达式教程中,它们都是特殊字符 - 括号表示它们之间的任何字符和此实例中的插入符号意味着任何不在方括号之间的字符。我在这里和谷歌搜索了解为什么这些字符也被接受但无法找到解释。
所以任何人都可以提供帮助,为什么我的输入会接受方括号和插入符号?
答案 0 :(得分:7)
原因是您使用的是A-z而不是A-Za-z。 Z(0x5a)和a(0x61)之间的ascii范围包括方括号,插入符号,反引号和下划线。
答案 1 :(得分:3)
你的正则表达式与你所说的不一致:
我想接受任何字母数字字符,空格和以下内容!&,'\ - 如果需要,我可以稍后再添加一些
如果您只想接受 这些字符,则需要删除插入符号:
var pattern = /^[A-Za-z0-9 "!&,'\\-]+$/;
注意:
A-z
还包含字符:
[\]^_`。
使用A-Za-z
或使用i
修饰符仅匹配字母:
var pattern = /^[a-z0-9 "!&,'\\-]+$/i;
\-
只是字符-
,因为反斜杠将作为转义的特殊字符。使用\\
允许反斜杠。
^
和$
是锚点,用于匹配字符串的开头和结尾。这可以确保整个字符串与正则表达式匹配。
+
来匹配多个字符。
如果您想要匹配其他字符而不是您接受的字符,并且正在使用此字符阻止用户输入“禁止”字符,则上面的第一个注释描述了您的问题。使用A-Za-z
代替A-z
(第二个注释也相关)。
答案 2 :(得分:0)
我不确定你想要什么,但我不认为你现在的正则表达式符合你的想法:
它试图找到一个不是A-z0-9 "!&,'\-
的字符(^
表示not
)。
另外,我甚至不确定A-z
匹配的是什么。它可以是a-z
或A-Z
。
因此,您当前的正则表达式匹配"."
和"Hi."
等字符串,但不匹配"Hi"
答案 3 :(得分:0)
试试这个:var pattern = /[^\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)。