我正在尝试记录使用常规表达式的验证规则的英语解释。我有两个我无法弄清楚的方面,而且我已经全身心地搜索过,无法找到有关我在下面确定的表达方式的任何信息:
[^<>()[\]\\.,;:\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,})))$
寻求任何帮助!
答案 0 :(得分:3)
可能是这个正则表达式是用一种语言编写的,其中双引号字符通过两个一起转义。我想也许VB(.Net)可以做到这一点......?
在这种情况下,\""
将被此语言解析为\"
,然后将其作为"
在正则表达式中进行解析。
答案 1 :(得分:0)
尝试使用Expresso - 它是一个RegEx工具,可以将RegEx转换为单词。
答案 2 :(得分:0)
正则表达式可能很难理解
基本上,square parentesis []
意味着表达式将匹配其中的任何字符。 \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
问题在于你使用的编程语言如何确保在表达式中得到那些双qoutes,而不算作我相信的代码。
答案 3 :(得分: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.
'''
正如您现在可以清楚地看到的,此正则表达式正在尝试验证电子邮件地址。它似乎也有人进入并编辑了文件并修改了双引号 - (\""
的每个实例应该只是"
,正如正则表达式引擎所见。另请注意,\""
序列在字符类中没有任何危害,因为它等同于双引号的单个实例。但是,它会导致恶作剧,它似乎是电子邮件第一部分的第二个选择,即\"".+\""
。这是一个修正版本,用双引号修复问题。我在这里已经完全评论了free-spaciong模式,并以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在编写和评论regex时很糟糕!