0

次のようなバランスの取れた中括弧構造の正規表現を書きたい

{...}{... {..}...}および{...{..{..}...}..{..}...}where...は、「{」または「}」文字を含まない任意のテキストを意味します

私がこれを行う場合:

   txt.replace(/\{[\s\S]+?}/g, 関数{return "_"+s+"_";})

最初}はエンドマッチと見なされるため { { } }_{ { }_ }

これを正規表現に変換したい_{ { } }_

PS: このfunction(s)部分は実際のコードからのものではありません。たとえば、
PPS: 可能であれば正規表現でこれを行いたいと考えています。
PPPS: テキストに含まれる '{' 括弧の最高レベルは制限されており、通常は 3 または 4 です。

更新: コメントありがとうございます。ネストされた中括弧の数を 3 に制限しましょう。

{ { { .. } .. { .. } } .. { .. } }

4

2 に答える 2

2

コメントありがとうございます。ネストされたブレースの数を 3 に制限しましょう。

これで、正規表現でできることがわかりました。(Perl や Python に見られるような、 「逆参照」と呼ばれるものを使用して、任意のネストされた中括弧に一致させることができる「拡張された」正規表現などがあります。Javascript の「正規表現」がそれらをサポートしているかどうかはわかりませんが、 .)

正規表現をバラバラに構築します。

まず、ネストされた波括弧のないチャンクがどのように見えるかを考えてみましょう:

[^{}]*

わかりました、それは簡単でした。中かっこ以外の任意の数の文字。:)

したがって、1 レベルの中括弧を含む構成は次のようになります。

{[^{}]*}

最初と最後にブレースが必要で、それ以外の場所には必要ないためです。

2段階まではどうですか?

さて、最初と最後にまだ中括弧があり、コンテンツは「データの任意の数のチャンクであり、それぞれに 0 または 1 レベルの中括弧があります」。

したがって、これらの 2 つの式を (どちらか一方に一致させるために) で結合して「0 または 1 レベルの中括弧」を|まとめ、その周りに括弧を置き (全体の単位として扱いたいため)、*その後、「括弧内に定義したばかりのこのものの任意の数」を示します。次に、ブレースが全体を囲みます。それは与える:

{({[^{}]*}|[^{}]*)*}
  ^^^^^^^^ ^^^^^^
exp. for   exp. for
1 level    0 levels

3段階の矯正は練習問題として残しています。:) ヒント: 同じロジックを適用します。中括弧は任意の数のチャンクを囲み、各チャンクには最大 2 レベルの中括弧があります。

于 2010-12-06T03:43:44.417 に答える
2

正規表現は、バランスの取れたテキストを任意のレベルのネストに一致させることはできません。少なくとも、非正規の延長がないわけではありません。

しかし、入れ子の量が制限されていて、問題に対する脆弱で鈍い解決策を気にしない場合は、それらを機能させることができます。

/{([^{}]*{[^{}]*})*[^{}]*}/

ネストされたブレースの 1 つのレベルに対して一致し、それを必要なネストのレベル数に拡張するのは (比較的) 簡単なはずです。

于 2010-12-06T03:38:48.523 に答える