ホームページ  >  記事  >  バックエンド開発  >  .net C#正規表現のバランスのとれたグループ/再帰的マッチング

.net C#正規表現のバランスのとれたグループ/再帰的マッチング

巴扎黑
巴扎黑オリジナル
2016-12-19 16:32:111585ブラウズ

.net C# 正規表現 バランス グループ/再帰マッチング

バランス グループ/再帰マッチング

ここで紹介するバランス グループ構文は、他の言語/ライブラリではこの関数がサポートされていないか、この関数がサポートされていない可能性があります。構文が必要です。

(100 * (50 + 15)) のようなネスト可能な階層構造を照合する必要がある場合、単に (.+) を使用すると、左端の括弧と右端の括弧 () の間の内容のみが一致します。ここでは貪欲モードについて説明していますが、怠惰モードにも次の問題があります)。 (5 / (3 + 2))) のように、元の文字列内の左括弧と右括弧の出現数が等しくない場合、一致結果内の 2 つの括弧の数は等しくなくなります。このような文字列の括弧内にある最長の一致するコンテンツを一致させる方法はありますか?

脳を完全に混乱させる ( と ( ) を避けるために、丸括弧の代わりに山括弧を使用しましょう。ここでの問題は、xx aa> yy をこのように文字列に入れる方法です。 、最も長い山括弧のペア内のコンテンツをキャプチャしますか?

ここでは次の構文構成を使用する必要があります:

(?'group') キャプチャされたコンテンツにグループという名前を付け、スタック (Stack) にプッシュします
(?' -group') 最後にスタックにプッシュされたグループという名前のキャプチャされたコンテンツをスタックからポップします。スタックが元々空の場合、このグループのマッチングは失敗します
(?(group)yes|no) スタックにキャプチャされたコンテンツがある場合。グループという名前のコンテンツ、式の Yes 部分との一致を継続し、それ以外の場合は no 部分との一致を継続します
(?!) ゼロ幅の否定先読みアサーション。接尾辞式がないため、一致しようとしても常に失敗します
If youプログラマーではない (または自分をプログラマーと呼んでいるが、スタックが何なのかを知らない) 場合は、上記の 3 つの構文を次のように理解できます。1 つ目は黒板に「グループ」を書くこと、2 つ目は黒板から「グループ」を描画します。 「グループ」を消去します。 3 番目のステップは、黒板にまだ「グループ」が書かれているかどうかを確認することです。

私たちがしなければならないのは、左括弧に遭遇するたびに「開く」を押すだけであり、右括弧に遭遇するたびに、最後にスタックが空かどうかを確認し、空であればそれを取り出します。空ではない場合、左括弧が右括弧よりも多いことが証明され、正規表現エンジンはバックトラックして (最初または最後の文字の一部を破棄し)


< と一致しようとします。 ; ;]* #一番左の括弧は括弧の内容ではありません
(
(
(? '開く' & lt;) #碰
[^& lt; & gt; & gt; ]* #左括弧の後の括弧ではないコンテンツと一致します
)+
#match 右括弧の後の括弧ではない内容
)+
)*
(?(Open)(?!)) #一番外側の右括弧に遭遇する前に、黒板に消去されていない「オープン」があるかどうかを確認します。ある場合は、マッチング失敗の最も一般的なアプリケーションです

& gt; コードをコピーします


最も一般的なアプリケーションは、HTML と一致するものです。次の例は、ネストされた & lt;div & gt; ラベルと一致します。 (?'開く']*>)[^<>]* )+((?'-開く'

)[^<>]*)+ )*(?(開く)(?!))

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

関連記事

続きを見る