0

私は正規表現について勉強しようとしています。ただし、これら 2 つの正規表現ステートメントが何を言っているのか理解できないようです。

private static final Pattern BALANCED_TEXT =
    Pattern.compile("(?s)((?:\\\\.|[^\\\\{}]"
                    + "|[{](?:\\\\.|[^\\\\{}])*[}])*)"
                    + "\\}"
                    + "|.");

private static final Pattern INPUT_PATTERN =
    Pattern.compile("(?s)(\\p{Blank}+)"
                    + "|(\\r?\\n((?:\\r?\\n)+)?)"
                    + "|\\\\([\\p{Blank}{}\\\\])"
                    + "|\\\\(\\p{Alpha}+)([{]?)"
                    + "|((?:[^\\p{Blank}\\r\\n\\\\{}]+))"
                    + "|(.)");

誰かがこれらの 2 つの正規表現ステートメントについて詳しく説明してくれれば幸いです。前もって感謝します!

4

1 に答える 1

3

最初の正規表現全体は次のとおりです。

(?s)((?:\\\\.|[^\\\\{}]|[{](?:\\\\.|[^\\\\{}])*[}])*)\\}|.

最初に、Java 文字列エスケープを廃止する必要があります (たとえば\\、 を意味するため\)。正規表現を取得します:

(?s)((?:\\.|[^\\{}]|[{](?:\\.|[^\\{}])*[}])*)\}|.

最初に行うのは、改行に一致(?s)させる DOTALL フラグ.です。2 番目に注目すべきは、トップ レベルの構造です。|は OR 演算子であるため、優先順位が最も低く、次のようになります。

(something)\} OR SINGLE ANY CHARACTER - DOT

そのため、最初に末尾が}(}は正規表現の特殊文字であるため、先頭に\.}()

最も外側にあるものを見てみましょう()

最も外側のフォームは(?: something)*. の 0 回以上の繰り返しに一致しますsomething

(?: )は、内部にあるものが非キャプチャ グループであることを意味します。つまり、試合のようにグループを生成しません( )。これにより、|最も外側の|..

それが何であるか見てみましょうsomething。これは、左から右に試行される一連の OR 式です。

最初のものは、どの文字が後に続くかです (通知はエスケープされ\\.ますが、エスケープされません。\\\\.

2 つ目は、 or[\\{}]以外の任意の文字に一致する文字クラスです。\{}

3 つ目は、一致する文字の{後に 0 個以上の内部の一致が(?: )続き、その後に}. 内部(?: )一致では、任意の文字、またはor\以外の任意の文字が続きます。\{}

したがって、これをまとめると、次のようになります。

最初の部分は}(グループ 1 は含まれませんが}、全体の一致は可能ですが、最後}までは一致します:

  • 空の文字列
  • によってエスケープされたすべての文字\
  • 間の文字列{ }

\次のように説明すると、それ自体を除いてほとんどすべてに一致しますが、{ }相互に一致しない場合、ネストされた{ }ペアには一致しません。上記の例外は でエスケープできます\

また、任意の文字 (最後の.) にも一致しますが、その一致には空のグループ 1 があります。

一致する (java エスケープされていない) 文字列のサンプル:

a}h{ello}}h{\{ello}}xh{\\ello}}_{}}

一致しないため、その正規表現は間違っているようですが、名前が付けられている間{}は一致}します。{}}BALANCED_TEXT

于 2013-10-21T14:18:17.920 に答える