【问题标题】:Why this Regex, matches incorrect characters?为什么这个正则表达式匹配不正确的字符?
【发布时间】:2011-10-08 13:22:01
【问题描述】:

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

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

我用这个Regex来匹配字符:

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

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

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

【问题讨论】:

  • 不要假设转义多余的连字符(或将其移至开头或结尾)会改变任何事情。

标签: javascript .net regex


【解决方案1】:

您没有转义破折号-,它是一个保留字符。如果您添加用\- 替换破折号,则正则表达式不再匹配那些在 # 和\

之间的字符

【讨论】:

    【解决方案2】:

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

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

    否则它被视为指定一个范围,就像你在0-9中使用它时一样。

    【讨论】:

      【解决方案3】:

      - 符号,当不转义时,在方括号中具有特殊含义。 #-\. 被转换成#-.(顺便说一句,方括号中点前的反斜杠不是必须的),意思是“#(ASCII 0x23)和.(ASCII 0x2E)之间的任何字符。正确的表示法是

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

      【讨论】:

        【解决方案4】:

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

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

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

        您的正则表达式因此变为:

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


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

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

        【讨论】:

          【解决方案5】:

          试试看

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

          【讨论】:

          • 你的意思是我应该转义每个字符?我认为没有必要。
          • 在这种情况下,你是 100% 确定你没有冲突
          • 我认为转义 从不在正则表达式中具有特殊含义的字符没有任何意义。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 2011-09-17
          相关资源
          最近更新 更多