マッチング モード
JDK は、貪欲モード (貪欲)、消極モード (消極)、所有モード (所有) の 3 つのマッチング モードを提供します。これらは、3 種類の所有量指定子に対応します。貪欲モードはデフォルト モードであり、消極モードです。式の後に ? を追加することで示されます。所有モードは、式の末尾に + を追加することで示されます。
3 つのモードの意味は何ですか?
貪欲モードの意味は、全体的な一致を満足させながら、できるだけ多くの一致を一致させることです。
消極モードの意味は、全体的な一致を満足させながら、可能な限り一致を少なくすることです。
ポゼッションモードの意味は、できるだけ多く一致させることです。一致しすぎて配置が一致しない場合、後戻りはできません。
たとえば、次のような文字列があります。
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n
greedy モードでの式マッチング:
/m/t.*/nl/n/p/m
此时匹配结果为 /m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
仕方なくモードでの式マッチング:
/m / t/.*?/nl/n/p/m
此时匹配结果为 /m/t/wd/nl/n/p/m
/m/t/wdx+?/nl/n/p/m
この場合、+ は at を意味するため、一致しません。最小一致 1 つ、消極モードでは、少なくとも 1 つと一致する必要があるため、一致は失敗します。
占有パターンの式マッチング:
/m/t.*+/nl/n/p/m .* が一致する文字が多すぎるため、現時点では一致できず、後で一致させることができなくなります。
注: 変数一致ルールには、強制量指定子または所有量指定子のみを使用できます。たとえば、X?? は文字 X の一致をできるだけ少なくすることを意味しますが、X? はデフォルトの貪欲モードであり、できるだけ一致させることを意味します。別の例: X{n} は、n の性質に一致するように準備する必要があることを意味します。
Looking はこのようなシナリオに適しています。通常のマッチングを行うとき、特定の式をキャプチャ (消費) せずに、一致した部分の前後に特定の式があるかどうかを知る必要があります。
lookaround を使用せず、式を直接使用して判断する場合、これらの一致した式は必然的に消費されます。
例: ILoveYou という文を分割したいとします。原則として、大文字が出現すると、それは新しい単語とみなされます。
この一致ルール:
\p{Upper}\p{Lower}*[\p{Upper}]?
を使用すると、一致した大文字が消費されます。マッチング結果は次のようになります:
IL
You
これは要件を満たしていません。
解決策は lookaround を使用することです。正規表現は次のとおりです:
\p{Upper}?\p{Lower}*(?=[\p{Upper}]?)
出力結果は次のとおりです:
I
Love
You
lookaround には 4 つのタイプがあります:
(?=X) は何を意味しますか以下は正規表現式 X です。前の部分と一致する場合、X 部分は消費されず、キャプチャされません。ゼロ幅の前方ポジティブ予測。
(?<=X) は、前の部分が正規表現 X であることを意味します。次の部分と一致する場合、X 部分は消費されず、キャプチャされません。 ゼロ幅の逆ポジティブ予測。
(?!X) は、その後に続くものが正規表現 X ではないことを意味します。前の部分と一致する場合、X 部分は消費されず、キャプチャされません。ゼロ幅の前方ネガティブ予測。
(?!=X) は、前の部分が正規表現 X ではないことを意味します。後続の部分と一致する場合、X 部分は消費されず、キャプチャされません。 ゼロ幅の後方ネガティブ予測。
非キャプチャー所有格マッチング
(?>X) これは明確に研究されていません。