ホームページ  >  記事  >  Java  >  入れ子になった括弧は再帰やグループのバランスをとらずに照合できますか?

入れ子になった括弧は再帰やグループのバランスをとらずに照合できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 12:25:02956ブラウズ

Can Nested Brackets Be Matched Without Recursion or Balancing Groups?

再帰やグループのバランスをとらずに入れ子になった括弧を照合する

正規表現を使用して入れ子になった括弧を照合することは、特に 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)

この方法により、再帰やグループのバランスをとらずに、ネストされた括弧を効率的にマッチングできます。


  1. (

以上が入れ子になった括弧は再帰やグループのバランスをとらずに照合できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。