2016-09-13 38 views
-2

大括弧または中括弧の外側にのみ存在するコンマをターゲットにする正規表現を書く必要があります。JS Regexがネストされた中括弧の外側の文字と一致するようにする

は現在、私は持っている:

var regex = /,(?![^{]*})(?![^[]*])/g 

ターゲット文字列があるとき:

var str = '"a":[{"b":2,"c":["d"]}],"b":2' // OK: only second comma matches 

パターンが正しくのみ二コンマと一致します。

ターゲット文字列は次のとおりです。

var str = '"a":[{"b":2,"c":{"d":9}}],"b":2' // OK: only second comma matches 

パターンも正しくのみ二コンマと一致します。

ただし、ターゲット文字列に配列とオブジェクトが含まれている場合、否定ルックアヘッドは失敗し、正規表現は両方のコンマに一致します。

var str = '"a":[{"b":2,"c":[{"d":9}]}],"b":2' // BAD: both commas match 
+0

なぜこれが必要ですか? – Phil

+4

この受け入れられた答えhttp://stackoverflow.com/a/546457/1679286で述べたように、それをコード化するほうがいいでしょう。**正規表現はこの仕事のための正しいツールではありません**。 –

+0

これを使用してJSONパーサーを作成します。 – RhinoDavid

答えて

-1

この正規表現は、言及した例を挙げて(see demo)が動作します:

,(?!([^{]*{[^{]*})?[^{]*})(?!([^[]*\[[^[]*])?[^[]*]) 

しかし、それは一般的な正規表現ではありません。

ネストされた角括弧の各レベルに対して、正規表現を拡張する必要があります。たとえば、あなたが必要となります"a":[{"b":2,"c":[{"d":[{"e":9}]}]}],"b":2も一致します

,(?!([^{]*{([^{]*{[^{]*})?[^{]*})?[^{]*})(?!([^[]*\[([^[]*\[[^[]*])?[^[]*])?[^[]*]) 

See second demoを。

これはスケーラブルな解決策ではありませんが、正規表現を使用する唯一の方法です。 好奇心のため。

+0

私はdownvoteの理由を知りたいです。 – horcrux

関連する問題