为什么这个正则表达式匹配不正确的字符?

时间:2011-10-08 13:22:02

标签: javascript .net regex

我需要匹配这些字符。该引用来自API文档(我们公司外部):

  

有效字符:0-9 A-Z a-z& # - 。 ,()/:; '@“

我使用此Regex来匹配字符:

^[0-9a-z&#-\.,()/:;'""@]*$

但是,这会错误地匹配%$等字符以及许多其他字符。怎么了?

您可以使用http://regexhero.net/tester/在线测试此正则表达式,此正则表达式适用于.NET和JavaScript。

5 个答案:

答案 0 :(得分:6)

你没有逃脱破折号-,这是一个保留字符。如果您添加使用\-替换短划线,则正则表达式不再匹配 #\

之间的字符

答案 1 :(得分:5)

将文字-移到字符集的前面:

^[-0-9a-z&#\.,()/:;'""@]*$

否则将其视为指定范围,就像在0-9中使用它一样。

答案 2 :(得分:3)

-符号在未转义时在方括号中具有特殊含义。 #-\.转换为#-.(BTW,在方括号中不需要点之前的反斜杠),这意味着“#(ASCII 0x23)和.之间的任何字符(ASCII 0x2E)。正确的表示法是

^[0-9a-z&#\-.,()/:;'"@]*$

答案 3 :(得分:3)

字符类中的特殊字符是右括号(]),反斜杠(\),插入符号(^)和连字符( - )。

因此,你应该用反斜杠(\)来逃避它们,或者把它们放在没有歧义的位置,它们不需要转义。在连字符的情况下,这将是第一个或最后一个位置。

您也不需要转义点(。)。

你的正则表达式因此变成:

^[-0-9a-z&#.,()/:;'"@]*$

<小时/> 作为旁注,有许多可用的正则表达式评估器提供代码提示。这样,您只需将鼠标悬停在正则表达式上即可,可以用英文单词进行解释。 其中一个免费的是RegExr

在其中键入原始正则表达式并将鼠标悬停在连字符上显示:
Matches characters in the range '#-\'

答案 4 :(得分:0)

试试

^[0-9a-zA-Z\&\#\-\.\,\(\)\/\:\;\'\"\@]*$