ホームページ >Java >&#&チュートリアル >入れ子になった括弧は再帰やグループのバランスをとらずに照合できますか?
再帰やグループのバランスをとらずに入れ子になった括弧を照合する
正規表現を使用して入れ子になった括弧を照合することは、特に Java などの再帰を使用する言語では困難になる可能性があります。バランシング グループはサポートされていません。幸いなことに、前方参照を使用してこの制限を克服することは確かに可能です。
外部グループの一致
次の正規表現 [1] は、次の正規表現の外部グループと一致します。深さに制限を課すことなく括弧を使用します:
(?=\()(?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)
ここで、式は、一致しない開き括弧を除外して開き括弧を先読みし、対応する閉じ括弧をキャプチャします。キャプチャされた部分文字列は役に立ちませんが、一致を完了するためのプレースホルダーとして機能します。
内部グループの一致
内部グループを含めるには、次の式をキャプチャできます [2]:
(?=\()(?=((?:(?=.*?\((?!.*?)(.*\)(?!.*).*))(?=.*?\)(?!.*?)(.*)).)+?.*?(?=)[^(]*(?=$)))
キャプチャ グループを追加し、後方参照インデックスを調整することにより、この式は内部グループもキャプチャします。
仕組み
メソッドは文字列を反復処理し、それぞれの場合で残りの文字列をキャプチャしながら、次の開き括弧と閉じ括弧を照合します。先読みにより、かっこがバランスよく一致することが保証されます。
式は次のように構成されます:
Component | Description |
---|---|
(?=() | Asserts that '(' precedes complex parsing |
(?: | Start of non-capturing group for repeated string processing |
(?= | Assert that the next '(' follows |
.?((?!.?1) | Match until the next '(' not followed by group 1 |
(.)(?!.2).* | Fill group 1 with the string, ensuring another ')' exists |
) | Assert that the matching ')' is valid |
.?)(?!.?2) | Assert that the next ')' not followed by group 2 exists |
(.*) | Fill group 2 with the remaining string |
) | Assert that the matching ')' is valid |
Consume a single character to continue matching within the group | |
) ? | Repeat the group (in the inner loop) |
.*?(?=1) | Match up to and including the last '(' found |
1*(?=2$) | Match up to the last ')' (but within the valid group) |
この方法により、再帰やグループのバランスをとらずに、ネストされた括弧を効率的にマッチングできます。
以上が入れ子になった括弧は再帰やグループのバランスをとらずに照合できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。