再帰やグループのバランスをとらずに入れ子になった括弧を照合する
正規表現を使用して入れ子になった括弧を照合することは、特に Java のような再帰を使用する言語では困難になる可能性があります。バランシング グループはサポートされていません。幸いなことに、前方参照を使用してこの制限を克服することは確かに可能です。
外側のグループの一致
次の正規表現 [1] は、次の正規表現の外側のグループと一致します。深さに制限を設けずに括弧を使用する:
(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).) ?.*?(?=\1)[^(]*(?=\2$)
ここで、式は、一致しない開き括弧を除いて開き括弧を先読みし、対応する閉じ括弧をキャプチャします。キャプチャされた部分文字列は役に立ちませんが、一致を完了するためのプレースホルダーとして機能します。 ]
内部グループの一致内部グループを含めるには、次の式をキャプチャできます
[2]:(?=\()( ?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(? !.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))
(?=\()(?=((?:(?=.*?\((?!.*?\2)(.*\)(?!.*\3).*))(?=.*?\)(?!.*?\3)(.*)).) ?.*?(?=\2)[^(]*(?=\3$)))仕組み
メソッドは文字列を反復処理し、次の開き括弧と閉じ括弧を照合します。それぞれのケースで残りの文字列をキャプチャします。先読みにより、かっこがバランスよく一致することが保証されます。
式は次のように構成されます:
Description | ]|
---|---|
複雑な解析に '(' が先行することをアサートします | |
繰り返し文字列処理の非キャプチャ グループの開始 | |
次の '(' が続くことをアサートします | |
?\1)グループ 1 が続かない次の '(' まで一致します | |
\2).*グループ 1 に文字列を入力し、別の ')' が存在することを確認します | |
一致する ')' が有効であることをアサートします | |
?\2)グループ 2 の後に次の ')' が存在しないことをアサートします | |
グループ 2 に残りの文字列を入力します | |
一致する ')' が有効であることをアサートします | |
1 文字を使用して一致を継続しますグループ | |
グループを繰り返します (内側のループ内) | |
見つかった最後の '(' まで一致します | |
1*(?=\2 $)最後の ')' まで照合します (ただし、有効なグループ内です) |
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3