元の正規表現を考えると:
^((([^<>()[\]\\.,;:\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.
'''
ご覧のとおり、この正規表現はメールアドレスを検証しようとしています。また、誰かがファイルにアクセスして編集し、二重引用符を壊したようです-(の各インスタンスは、正規表現エンジンで見られるの\""
と同じようになります)。シーケンスは、二重引用符の単一インスタンスと同等であるため、文字クラス内では害がないことにも注意してください。ただし、電子メールの最初の部分の2番目の選択肢として表示されるいたずらを引き起こしています。これは、二重引用符の問題を修正した修正バージョンです。ここでは、自由空間モードで、すべての引用符と円記号の適切なエスケープを示す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は最悪です!