2017-05-09 9 views
2

まで、すべてのものを抽出するために正規表現を使用した:私は次の文を持っている特定のシンボルをダブル発生

以下 JSONように私に渡している
column1==1 && 'column2'=='value' || year == 2006 || ('column2'=='value1' && 'column2'!='value2') 

:私はこのJSONから抽出したい

{ 
    "type": "ExpressionStatement", 
    "expression": { 
     "type": "LogicalExpression", 
     "operator": "||", 
     "left": { 
      "type": "LogicalExpression", 
      "operator": "||", 
      "left": { 
       "type": "LogicalExpression", 
       "operator": "&&", 
       "left": { 
        "type": "BinaryExpression", 
        "operator": "==", 
        "left": { 
         "type": "Identifier", 
         "name": "column1" 
        }, 
        "right": { 
         "type": "Literal", 
         "value": 1, 
         "raw": "1" 
        } 
       }, 
       "right": { 
        "type": "BinaryExpression", 
        "operator": "==", 
        "left": { 
         "type": "Literal", 
         "value": "column2", 
         "raw": "'column2'" 
        }, 
        "right": { 
         "type": "Literal", 
         "value": "value", 
         "raw": "'value'" 
        } 
       } 
      }, 
      "right": { 
       "type": "BinaryExpression", 
       "operator": "==", 
       "left": { 
        "type": "Identifier", 
        "name": "year" 
       }, 
       "right": { 
        "type": "Literal", 
        "value": 2006, 
        "raw": "2006" 
       } 
      } 
     }, 
     "right": { 
      "type": "LogicalExpression", 
      "operator": "&&", 
      "left": { 
       "type": "BinaryExpression", 
       "operator": "==", 
       "left": { 
        "type": "Literal", 
        "value": "column2", 
        "raw": "'column2'" 
       }, 
       "right": { 
        "type": "Literal", 
        "value": "value1", 
        "raw": "'value1'" 
       } 
      }, 
      "right": { 
       "type": "BinaryExpression", 
       "operator": "!=", 
       "left": { 
        "type": "Literal", 
        "value": "column2", 
        "raw": "'column2'" 
       }, 
       "right": { 
        "type": "Literal", 
        "value": "value2", 
        "raw": "'value2'" 
       } 
      } 
     } 
    } 
} 

文字列は、バイナリ式のオペランドだけです。

"left": { 
    "type": "Identifier", 
    "name": "column1" 
}, 
"right": { 
    "type": "Literal", 
    "value": 1, 
    "raw": "1" 
} 

私は列名と比較値を得ることができ、その文字列を持つ:たとえば、column1==1のために私はJSON文字列のこの部分のみを必要としています。 JSON形式の文字列は一貫しているので、zero-width positive lookbehind assertionを使用して"type": "BinaryExpression",の値を確認できます。その後、すべてのデータを2番目の}に取得する必要があります。

}の2番目の出現まですべてを得る正規表現を使用する方法はありますか?

注:

  1. 私はいくつかのJSONstringにパーサーを使用する方がよいでしょうけど、私は(私はSQL Serverのコンテキストで働いています)は許されないのです。
  2. SQL Server 2016にはネイティブなJSONサポートがありますが、一部のデータベースは以前のバージョンになっています。
  3. 私はT-SQLの文脈で純粋なregexソリューションが必要です。私はthis one for exampleのような.netを使用することはできません。
+0

しかし、TSQLには正規表現をサポートしていません。 [SQL ServerでのRegExの使用](http://stackoverflow.com/questions/8928378/using-regex-in-sql-server)を参照してください。非常に限られた*ワイルドカード*パターンを使用することができます。私はquesitonのタグを付け直した。 –

+0

@WiktorStribiżew私はいくつかのSQL CLR正規表現関数を実装しました。私はregex replace、regex matches、regex splitなどを持っています。詳細はhttps://msdn.microsoftをご覧ください。com/ja-us/library/ff878119.aspx – gotqn

+0

[OK]を、しかしあなたは質問でそれを言及していない。私はregexタグを当てています。だから何を試しましたか? –

答えて

1
\"type\": \"BinaryExpression\",\s*(\".+\": +\"?.+\"?,?\s*)*(\".+\": \{\s*(\".+\": +\"?.+\"?,?\s*)+\},?\s*)+ 

大丈夫動作するようです。説明:

\"type\": \"BinaryExpression\",\s*検索テキスト `「タイプ」:最後に、オプションの,とフォーマット"something" : "something"

(\".+\": +\"?.+\"?,?\s*)*検索文字列の空白のいくつかの数字が続くものを、任意の数の後があるかもしれませんが、バイナリ表現」。 。バイナリ式、我々は最後に*追加また、いくつかの属性は、それらの周り""を持っていないとして、二qutationマークはオプションでもう一度、その後いくつかの空白によって `形式の

(\".+\": {\s*文字列。「何か:{」空白は

(\".+\": +\"?.+\"?,?\s*)+内容は"something": "else"の形式で、二重引用符はオプションです。このタイプのラインが数多くあるので、これに続いて、+

},?\s*)+これらのラインは、}で終わらなければならず、次に任意の昏睡を伴います。

は、ここでそれを試してみてください:https://regex101.com/r/IAgV0e/1

関連する問題