質問

中括弧内のコンテンツに一致する正規表現があります。たとえば、次の場合:

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

{'key':{'a':[1,2,3]}} および {'a':[1,2,3]と一致させたい} 、ただし {'key':{'a':[1,2,3]}

役に立ちましたか?

解決

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

一部の正規表現エンジン(Perl正規表現など)で許可されている再帰式など、拡張正規表現でそれを行う方法がありますが、それらは必ずしもきれいではありません。 ( too many php はPerlバージョンを提供しました: / \ {(?:[^ {}] + |(?R))* \} / には (?R)オプションは再帰的な一致です。)

しかし、この種のことをするのに必ずしも正規表現が必要なわけではありません。リスト内を歩いて、開いたブレースのスタックを保持するだけでそれを実行できます(そして、それらがどの位置に表示されたか)。その後、開いているブレースが表示されるたびにその位置をスタックにプッシュし、閉じているブレースが表示されるたびに、スタックから最後に表示された開いているブレースをポップし、その位置と現在の位置を部分文字列の境界として使用しますあなたのマッチの一つになります。文字列の最後に達するまで繰り返します。

他のヒント

かなり単純ですが、一致するものが見つかります:)

{'key': {'\w+': \[[\w,]*\w\]}}

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

最大のネストの深さを制限できる場合、ネストの可能なすべてのレベルを明示的にチェックする式を作成できます。一般に、おそらく何らかの種類のパーサーフレームワークを使用する方が良いでしょう。

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

/\{(?:[^{}]+|(?R))*\}/
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top