2

中括弧内のコンテンツに一致する正規表現はありますか。たとえば、次のようにします。

d = {'key': {'a': [1,2,3]}}

{'key': {'a': [1,2,3]}}{'a': [1,2,3]}に一致させたいのですが、 {'key': { ' a' には一致させません: [1,2,3]}

4

4 に答える 4

4

従来の正規表現では、これは不可能です。DFA はネストされたペアを解析できません。

一部の正規表現エンジン (Perl regex など) で許可されている再帰表現など、拡張正規表現を使用してこれを行う方法はありますが、常にきれいであるとは限りません。(あまりにも多くの phpが Perl バージョンを提供しました:/\{(?:[^{}]+|(?R))*\}/オプション(?R)は再帰マッチです。)

ただし、この種のことを行うために必ずしも正規表現が必要なわけではありません。リストをウォークスルーし、開いた波括弧のスタック (およびそれらが表示された位置) を保持するだけで、それを行うことができます。次に、左中括弧が表示されるたびにその位置をスタックにプッシュし、右中括弧が表示されるたびに、最後に表示された左中括弧をスタックからポップし、その位置と現在の位置を部分文字列の境界として使用しますこれはあなたの試合の1つになります。文字列の最後に到達するまで繰り返します。

于 2009-09-16T00:53:53.830 に答える
1

それはかなり単純ですが、一致を見つけます:)

{'key': {'\w+': \[[\w,]*\w\]}}
于 2009-09-16T01:05:32.120 に答える
0

正規表現はネストを処理できないため、一般的なケースで機能する正規表現はありません。

入れ子の深さの最大値を制限できる場合は、考えられるすべての入れ子レベルを明示的にチェックする式を作成できる可能性があります。一般的には、ある種のパーサー フレームワークを使用する方がよいでしょう。

于 2009-09-16T00:56:38.593 に答える
0

PCRE 正規表現ライブラリは、再帰を使用してこれを行うことができます。

/\{(?:[^{}]+|(?R))*\}/
于 2009-09-16T01:00:24.537 に答える