Java正規表現:番号が事前にわからない場合に、特定のコンテキストでキャプチャグループを逆参照する方法

死亡しました

はじめに、正規表現の問題を解決することについての古いことわざを知っています。また、正規表現を使用してXMLを処理する際の注意事項も知っています。でもちょっと我慢してください...

正規表現検索を実行して、文字のグループを置き換えようとしています。このグループがどのくらいの頻度で一致するかは事前にはわかりませんが、特定のコンテキストでのみ検索したいと思います。

例:次の文字列が"**ab**df**ab**sdf**ab**fdsa**ab**bb"あり、を検索し"ab"て置換したい場合"@ab@"、これは次の正規表現を使用して正常に機能します。

正規表現の検索:

(.*?)(ab)(.*?)

交換:

$1@$2@$3

予想通り、合計4試合になります。各一致内で、グループIDは同じであるため、後方参照($ 1、$ 2 ...)も正常に機能します。

ただし、文字列に特定のコンテキストを追加すると、上記の正規表現は失敗します。

検索文字列:

<context>abdfabsdfabfdsaabbb</context>

正規表現の検索:

<context>(.*?)(ab)(.*?)</context>

これにより、最初の一致のみが検索されます。ただし、キャプチャしないグループを元の正規表現に追加しても、機能しません("<context>(?:(.*?)(ab)(.*?))*</context>")。

私が欲しいのは、最初の検索(コンテキストなし)と同じように一致するリストです。これにより、各一致内でグループIDが同じになります。

これをどのように達成できるか考えていますか?

nhahtdh

解決

要件は、この質問の要件と似ています。プレフィックスとサフィックスの間のパターンの複数のインスタンスを照合してキャプチャします。私のこの答えで説明されている方法を使用して

(?s)(?:<context>|(?!^)\G)(?:(?!</context>|ab).)*ab

必要に応じてキャプチャグループを追加します。

警告

正規表現は、テキストのみ含めることが許可さいるタグに対してのみ機能することに注意してくださいタグに他のタグが含まれている場合、正しく機能しません。

また、終了タグのないab内部<context>タグとも一致し</context>ます。これを防ぎたい場合は、次のようにします。

(?s)(?:<context>(?=.*?</context>)|(?!^)\G)(?:(?!</context>|ab).)*ab

説明

正規表現を分解しましょう:

(?s)                        # Make . matches any character, without exception
(?:
  <context>
    |
  (?!^)\G
)
(?:(?!</context>|ab).)*
ab

(?:<context>|(?!^)\G)新しい<context>タグ内に入るか、前の一致から続行してサブパターンのより多くのインスタンスに一致しようとすることを確認します。

(?:(?!</context>|ab).)*気にしない(ではないabテキストに一致し、終了タグを通過しないようにし</context>ます。次にab、最後に必要なパターンに一致させます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ