0

正規表現を使用する検証ルールの英語の解釈を文書化しようとしています。私には把握できない 2 つの領域があり、全体を検索しており、以下で特定した式の断片に関する情報を見つけることができません。

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

これまでに(上記のスニペットから)解釈したことは、許可されていない文字、[^ and ]. 2 つのバック スラッシュのセットが 1 つあり、これは 1 つのバックスラッシュ文字を意味します。私が理解できない部分は\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

この正規表現は、二重引用符を 2 つ組み合わせることでエスケープする言語で記述されている可能性があります。私はおそらくVB(.Net)がこれを行うと思います..?

この場合\""、 はこの言語によって として\"解析され、正規表現では として解析され"ます。

于 2012-11-05T14:04:11.847 に答える
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.
    '''

ご覧のとおり、この正規表現はメールアドレスを検証しようとしています。また、誰かがファイルにアクセスして編集し、二重引用符を壊したようです-(の各インスタンスは、正規表現エンジンで見られるの\""と同じようになります)。シーケンスは、二重引用符の単一インスタンスと同等であるため、文字クラス内では害がないことにも注意してください。ただし、電子メールの最初の部分の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は最悪です!

于 2012-11-05T18:38:55.603 に答える
0

正規表現は理解するのが難しい場合があります

基本的に、角かっこ[]は、式がその中の任意の文字に一致することを意味します。\sスペースの表現

http://www.regular-expressions.info/を試してください

また、正規表現のバディも強くお勧めします。式の文言もあります。また、文字を正しくエスケープするためのコードも生成します。

\はプログラミング言語のエスケープ文字であり、式で何かを定義するために使用される文字でもあるため、式が読みにくくなる状況が発生する可能性があります。

それがあなたが問題を抱えているもののようです\""

他の部分:\"".+\""一致しているように見えるdouble quote followed by any character one to unlimited times and then ending in another double quote 問題は、使用するプログラミング言語が式内でこれらの二重引用符を確実に取得する方法にあり、私が信じているコードとしてはカウントされません。

于 2012-11-05T14:03:06.593 に答える