2012-03-07 7 views
2

これは前に尋ねられたと思うでしょうが、私はそれを見つけることができません。引用符で囲まれていないコンマで文字列を分割するJavascriptメソッド

引用符で囲まれていないカンマでjs文字列を区切る必要があります。私は二重引用符を使用しているので、少し単純にする必要があります。

私は2つのアプローチを試しましたが、それを釘付けにしませんでした。

は、私はこれをオンにする必要があります。この中

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code' 

[ 
'body.loaded"who, are , you" div"hello ,"#div-id span CODE', 
'body.loaded span"span, text" code' 
] 

1) - >良い部品、主に作品を一致させるが、私の結果に空の文字列のアロット私を与えます。

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.match(
    /([^,]*"[^"]*")*/g 
) 

['body.loaded"who, are , you" div"hello' ,'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' body.loaded span"span, text"', '', '', '', '', '', ''] 

私はそれが正規表現の()のためだと思います。

2)悪い部分を分割します。これはまだかなりありません。ここでの考え方は、「偶数個の続くコンマを一致させることです。

'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.split(
    /,(?![^"]*"[^"]*("[^"]*"[^"]*)*$)/ 
); 

基本的には、クリーナー、よりシンプルで美しい溶液(ルック尻をサポートしていませんjavascriptを念頭に置いてクマ)がなければならない。

+0

エスケープした二重引用符をサポートしていないと仮定できます。つまり、 '' test \ "、foo'は' test \ 'と' foo'として表示されますか? –

+0

@anubhavaそこに十分なコードはありませんか? –

+0

@ケビン・バラード私はエスケープせずに生きることができますが、結果は "テスト"とfooでなければなりません。 –

答えて

12

あなたは、二重引用符で囲まれた文字列でエスケープをサポートしていないと仮定すると、これはおそらく動作するはずです:

/(?:"[^"]*"|[^,])+/g 

あなたは、二重引用符で囲まれた文字列の内側にバックスラッシュ・エスケープをサポートしたいならば、このジョブを実行する必要があります。

/(?:"(?:\\.|[^"])*"|[^,])+/g 

二重引用符で囲まれた文字列の外側でもバックスラッシュエスケープをサポートしたい場合(例:初期見積もり)をエスケープし、これを試してみてください。

/(?:"(?:\\.|[^"])*"|\\.|[^,])+/g 

はここで第3のパターンがどのように機能するかについての説明です。

まず、拡張され、注釈付きバージョン:

(?:  # start a non-capturing group 
    "  # Match a double quote 
    (?: # Another non-capturing group, for the contents of the double-quote 
    \\. # Match any backslash-escaped character 
    | [^"] # or any non-double-quote character 
)*  # End the group. Repeat zero or more times 
    "  # Close double quote 
|  # Alternative to double-quoted string 
    \\. # Match any escaped character 
|  # Another alternative 
    [^,] # Match any non-comma character 
)+  # Close group, repeat one or more times 

3つの主要コンポーネントがここにあります。

最初は二重引用符で囲まれた文字列に一致します。二重引用符で囲まれた文字列がここで一致する可能性がある場合は、コンマ以外の規則を使用するのとは対照的に、これがグループ内で最初に来ます。この二重引用符で囲まれた文字列の中で、エスケープされた文字(\\.)と一致することができます。これにより、文字列の中で二重引用符をエスケープしたり、二重引用符以外の文字と一致したりすることができます。一重引用符で囲まれていない文字ルールでエスケープしないように、一度に1文字だけ一致させます。文字列の内容は*です。二重引用符で囲まれた文字列が空である可能性があり、文字列を終了させる可能性があるためです。

二重引用符で囲まれた文字列の代わりに、エスケープされた文字(\\.)と一致することがあります。これにより、二重引用符文字列の外側で二重引用符文字をエスケープできます。実際にはカンマもエスケープすることができます。あなたが望めばわかりません。あなたがそれを望まないなら、このルールは代わりに\\[^,]になるはずです。

最後に、ここで二重引用符で囲まれた文字列と一致することができず、エスケープに一致しない場合は、コンマ以外の任意の文字に一致します。これは、この規則で二重引用符やエスケープを後でキャッチしないように繰り返されません。

次に、+修飾子を使用してパターン全体を繰り返します。これにより、一度に複数のトークンを照合することができます。空の文字列が返されないように、*の代わりに+を使用します。

+0

うわー、あなたのまっすぐな忍者は、私はその事に3時間程を費やして、10秒でそれをやった。このソリューションの背後にある論理を説明することはできますか?もうちょっと忍者を気にする必要はありません。 –

+0

@RoderickObrist:答えの中で最長の説明を1分間で投稿します。 –

+0

@RoderickObrist:私の説明が適切であることを願っています。不明な点がある場合は、さらに質問してください。 –

関連する問題