2016-08-24 10 views
-1

JSON文字列があり、ネストされたオブジェクトを検索する必要があり、返された正規表現に一致するオブジェクトのみが返されます。RegExpを使用してJSONでオブジェクトを検索

{ 
    "some": { 
    "nested": { 
     "stuff": [ 
     { 
      "bla": "blub1", 
      "bar": "bar" 
     }, 
     { 
      "bla": "blub2", 
      "bar": "foo" 
     }, 
     { 
      "bla": "blub3", 
      "bar": "foobar" 
     } 
     ] 
    } 
} 

私はほとんどこれにreg EXP /{(.*?"bar": "foo".*?)}/gsでそれを得たが、これは唯一の一致するオブジェクトを返しません。

私はそれがこれを返すようにしたい:

{ 
    "bla": "blub2", 
    "bar": "foo" 
} 

参照:https://regex101.com/r/mK3oI6/3

私は実際に正規表現を使用する必要はありませんが、私は、オブジェクトを見つけるための最善の解決策を見つけようとしています入れ子にされたオブジェクトは正規表現でうまくいくと思っていました。

編集:私は、これは良い方法ではないことをunterstandが、私はちょうど正規表現とJSONをパース間のパフォーマンスをしようとして見たいと、あなたは正規表現を使用してdeadsetいる場合

+1

本当にjsonで動作するツールではありません。たとえば、JSON文字列の値に '}'文字が含まれていると、素朴な実装が破られます。より堅牢な実装は可能ですが、すべての可能なケースを処理することはできず、一般的には面倒なことではありません。たぶんあなたはあなたがどんな環境にいるかを教えて、もう少し適切なツールを提案することができますか? – Aaron

+1

このようなシナリオで正規表現を使用しないでください。あなたのjson文字列をjsonオブジェクトにパースして、目的の部分を得るためにオブジェクトをトラバースします。あなたはそれにマッチ関数を書くことができます。 –

+0

あなたは正確に何を試そうとしていますか? –

答えて

1

深い検索を行います:

[^{]*?({\s+"bla[^}]*?})

基本的に、最初の{ <space> "barまで非欲張り探索は、最初に右中括弧までキャプチャありません。

編集:あなただけのN番目のインスタンスをしたい場合は、[^{]*?(?:{\s+"bla[^}]*?}){N}[^{]*?({\s+"bla[^}]*?})

あなたがバーで一つだけをしたい場合:FOO:JSONを使用した

.*{([^}]*bar.*?foo"[^}]*?)}

REGEX WITHは悪い考えです。気まぐれになり、簡単に壊れる可能性があります。基本的なiterable型の1つを使用し、jsonライブラリを使用してjsonをロードし、必要なデータを取得するためにインデックスを作成する方が良い考えです。

+0

最初の正規表現は "foor": "bar"のものだけでなく、すべてのものとマッチします。 私は実際には正規表現を使いたくないので、入れ子になったオブジェクト内のオブジェクトを見つけるのに最適なソリューションを見つけようとしています。 – Heiko

+0

@Heikoそれでは、なぜあなたの質問のタイトルに「正規表現」を付けましたか? –

+0

私はさまざまなアプローチを試してみたいので、regexpと一緒に試してみたいと思っています。 – Heiko

-1

あなたは、間違った位置にあなたが {.*("bar": "foo").*}

をすればそれだけで、一致する部分を返します(それは、Aである、あなたの試合

を見つけるまで、あなたはすべてのものをキャプチャしているこの方法を括弧を入れています貪欲な検索、サイズに注意してください)

関連する問題