0

次の文字列があるとしましょう:

"<aa v={<dd>sop</dd>} z={ <bb y={ <cc x={st}>ABC</cc> }></bb> }></aa>"

{}または. _ <dd>sop</dd>_<bb y={ <cc x={st}>ABC</cc> }></bb>

"(\s*\w*=\s*\{)\s*(<.*>)\s*(\})"一致を書いた正規表現

"<dd>sop</dd>} z={ <bb y={ <cc x={st}>ABC</cc> }></bb>"これは正しくありません。

4

2 に答える 2

2

一般的な正規表現では、ネストを適切に処理する方法はありません。したがって、このような質問が出てきたときのすべての勝利 - 正規表現を使用して XML/HTML を解析しないでください。

ただし、いくつかの単純なケースでは、それが有利な場合があります。あなたの例のように、ネストのレベル数が限られている場合は、レベルごとに 1 つの正規表現を簡単に追加できます。

それでは、これを段階的に実行しましょう。最初のネストされていない属性を処理するには、使用できます

{[^}]*}

これは、開始中括弧の後に右中括弧以外の任意の数が続き、最後に右中括弧続くものと一致します。簡単にするために、次のように、その中心を非キャプチャグループに入れます

{(?:[^}])*}

これは、代替のものを挿入するときに必要になるためです。

閉じ中かっこ( [^}]) 以外のものを別のネストされた中かっこのレベルにすることを許可し、次のように最初の正規表現と単純に結合する場合

{(?:{[^}]*}|[^}])*}
    ^^^^^^^    original regex inserted as alternative (to it self)

1 レベルのネスティングが可能です。同じことをもう一度行い、この正規表現をそれ自体の代替として結合します

{(?:{(?:{[^}]*}|[^}])*}|{[^}]*}|[^}])*}
        ^^^^^^^^^^^^^^^    previous level repeated

別のレベルのネストが可能になります。必要に応じて、これをさらに多くのレベルで繰り返すことができます。

ただし、これは属性名などのキャプチャを処理しません。なぜなら、あなたの質問はあなたがそこに何を求めているのかはっきりしていないからです。正規表現でネスト。

ここで regex101 で例を処理することがわかります

よろしく

于 2016-05-09T11:06:37.063 に答える
0

バランスの取れたブレースのセットを処理しようとしています。これには、再帰的な正規表現が必要です。定義上、再帰的な正規表現は規則的ではありません。いずれにしても、Perl、PHP、ruby など、一部の言語はそれらをサポートしています。これは、トピックに関する優れたチュートリアルです。

通常、この種の情報は、yacc などの本格的なパーサーを使用して抽出する必要があります。

これは、バランスの取れていない中かっこを処理できる正規表現です: ([ =]*)=(\{[^}]*\}). これは一致{<dd>sop</dd>}し、{st}どちらが正しいです。残念ながら、それも一致し{ <bb y={ <cc x={st}ますが、これはあなたが望むものではありません.

于 2016-05-09T11:03:13.383 に答える