0

我正在尝试记录使用正则表达式的验证规则的英文解释。我有两个我无法弄清楚的领域,我已经搜索了所有内容,但找不到关于我在下面识别的表达式片段的任何信息:

[^<>()[\]\\.,;:\s@\""]

到目前为止我所解释的(来自上面的代码片段)是这列出了不允许的字符,那些在[^ and ]. 有一组双反斜杠,这意味着一个反斜杠字符。我无法弄清楚的部分是\s@\"" 我看到 \s 表示空格,我假设 @ 是它代表的字符,但我不知道是什么\""意思。我也不确定 s@ 周围的反斜杠是否是某种分隔符,这改变了我上面的解释。

我无法解释的另一部分是:

\"".+\""

\" 或 \"" 没有定义(至少我能找到)我的印象是反斜杠不应该是独立的,也就是说它们要么转义一些特殊字符,要么成对使用来表示反斜杠本身。

如果它有助于完整的正则表达式是:

^((([^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})))$

感谢任何帮助!

4

3 回答 3

3

可能是这个正则表达式是用一种语言编写的,其中双引号字符通过将两个放在一起进行转义。我想也许 VB(.Net) 会这样做..?

在这种情况下\"",该语言将解析为\",然后在正则表达式中解析为"

于 2012-11-05T14:04:11.847 回答
0

正则表达式可能很难理解

基本上,方括号[]意味着表达式将匹配其中的任何字符。\s空间表达式

试试http://www.regular-expressions.info/

我也可以强烈推荐Regex Buddy它也有表达的措辞。它还会为您生成代码,以确保您正确转义字符。

由于\它既是编程语言中的转义字符,又是用于在表达式中定义事物的字符,因此您可能会遇到一些使表达式难以阅读的情况。

看起来这就是您遇到的问题\""

另一部分:\"".+\""似乎匹配double quote followed by any character one to unlimited times and then ending in another double quote 问题在于您使用的编程语言如何确保在表达式中获得那些双引号,而不是我相信的代码。

于 2012-11-05T14:03:06.593 回答
0

鉴于您的原始正则表达式:

^((([^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,})))$

我已经破译了这一点,并以自由间距模式将其写出来并附有评论。我在这里以 Python 的原始文本格式呈现它,以便您可以看到本地正则表达式,因为它被呈现给正则表达式引擎(在字符串解释之后):

原生正则表达式中注释的原始表达式:

re_commented = r'''
    # Match an email address.
    ^                                 # Anchor to start of string.
    (                                 # ($1:) Entire string.
      (                               # $2: FIRST PART (before @).
        ( [^<>()[\]\\.,;:\s@\""]+     # ($3:) Either one
          (                           # ($4:) or more
            \.                        #       dot separated
            [^<>()[\]\\.,;:\s@\""]+   #       parts.
          )*                          # ($4:)
        )                             # ($3:)
      | (                             # ($5:) Or FIRST PART is
          \"".+\""                    # a doubly, double quoted string.
        )                             # ($5:)
      )                               # $2: FIRST PART (before @).
      @                               # Required @ separates parts.
      (                               # $6: LAST PART (after @).
        ( \[                          # ($7:) LAST PART is Either
          [0-9]{1,3}\.                # an IPv4 domain address
          [0-9]{1,3}\.                # (i.e. 10.0.0.255)
          [0-9]{1,3}\.                # between
          [0-9]{1,3}                  # square
          \]                          # brackets.
        )                             # ($7:)
      | (                             # ($8:) Or LAST PART is
          ([a-zA-Z\-0-9]+\.)+         # a DNS style dot separated
          [a-zA-Z]{2,}                # named domain.
        )                             # ($8:)
      )                               # $6: LAST PART (after @).
    )                                 # ($1:) Entire string.
    $                                 # Anchor to end of string.
    '''

您现在可以清楚地看到,此正则表达式正在尝试验证电子邮件地址。似乎有人已经进入并编辑了文件并损坏了双引号 - (每个实例都\""应该" 与正则表达式引擎一样)。另请注意,该\""序列在字符类中没有任何危害,因为它等同于双引号的单个实例。但是,它会造成恶作剧,因为它显示为电子邮件第一部分的第二种选择,即\"".+\"". 这是一个更正的版本,它解决了双引号的问题。我在这里展示了它,它以自由空格模式和 Java 片段的形式进行了完整的注释,展示了所有引号和反斜杠的正确转义。

修复了在 Java 正则表达式字符串中注释的表达式:

Pattern re_valid = Pattern.compile(
    "    # Match an email address. (Rev:20121105_1100 fixed quotes.)        \n" +
    "    ^                                     # Anchor to start of string. \n" +
    "    (                                     # ($1:) Entire string.       \n" +
    "      (                                   # $2: FIRST PART (before @). \n" +
    "        ( [^<>()\\[\\]\\\\.,;:\\s@\"]+    # ($3:) Either one           \n" +
    "          (                               # ($4:) or more              \n" +
    "            \\.                           #       dot separated        \n" +
    "            [^<>()\\[\\]\\\\.,;:\\s@\"]+  #       parts.               \n" +
    "          )*                              # ($4:)                      \n" +
    "        )                                 # ($3:)                      \n" +
    "      | (                                 # ($5:) Or FIRST PART is     \n" +
    "          \".+\"                          # a double quoted string.    \n" +
    "        )                                 # ($5:)                      \n" +
    "      )                                   # $2: FIRST PART (before @). \n" +
    "      @                                   # Required @ separates parts.\n" +
    "      (                                   # $6: LAST PART (after @).   \n" +
    "        ( \\[                             # ($7:) LAST PART is Either  \n" +
    "          [0-9]{1,3}\\.                   # an IPv4 domain address     \n" +
    "          [0-9]{1,3}\\.                   # (i.e. 10.0.0.255)          \n" +
    "          [0-9]{1,3}\\.                   # between                    \n" +
    "          [0-9]{1,3}                      # square                     \n" +
    "          \\]                             # brackets.                  \n" +
    "        )                                 # ($7:)                      \n" +
    "      | (                                 # ($8:) Or LAST PART is      \n" +
    "          ([a-zA-Z\\-0-9]+\\.)+           # a DNS style dot separated  \n" +
    "          [a-zA-Z]{2,}                    # named domain.              \n" +
    "        )                                 # ($8:)                      \n" +
    "      )                                   # $6: LAST PART (after @).   \n" +
    "    )                                     # ($1:) Entire string.       \n" +
    "    $                                     # Anchor to end of string.   ", 
    Pattern.COMMENTS);

请注意,此正则表达式还有其他大多数小问题(Google“电子邮件验证”更多。)此外,许多分组括号是不必要的。

最后一条评论 - Java 在编写和评论正则表达式方面很糟糕!

于 2012-11-05T18:38:55.603 回答