5

次のような文字列があります

var str="A,B,C,E,'F,G,bb',H,'I9,I8',J,K"

文字列をコンマで分割したいと思います。ただし、何かが単一引用符で囲まれている場合は、次のようにコンマを無視する必要があります。

 A
 B
 C
 E
 F,G,bb
 H
 I9,I8
 J
 K
4

3 に答える 3

12
> str.match(/('[^']+'|[^,]+)/g)
["A", "B", "C", "E", "'F,G,bb'", "H", "'I9,I8'", "J", "K"]

これを要求しましたが、たとえば次のようなコーナーケースを考慮していない可能性があります。

  • 'bob\'s''エスケープされる文字列です
  • a,',c
  • a,,b
  • a,b,
  • ,a,b
  • a,b,'
  • ',a,b
  • ',a,b,c,'

上記のいくつかは、これによって正しく処理されます。他の人はそうではありません。現在または将来 (コードを拡張する場合、または他の人が使用する場合) にセキュリティの脆弱性や微妙なバグなどを回避するために、これを熟考したライブラリを使用することを強くお勧めします。


正規表現の説明:

  • ('[^']+'|[^,]+)-またはのいずれに一致することを意味します '[^']+' [^,]+
  • '[^']+'quote...1 つ以上の非引用符...quote を意味します。
  • [^,]+1 つ以上の非コンマを意味します

注: 引用符で囲まれていない文字列の前に引用符で囲まれた文字列を使用することにより、引用符で囲まれていない文字列のケースの解析が容易になります。

于 2012-05-16T11:31:56.103 に答える
6

これは、一重引用符と二重引用符で動作し、コンマが埋め込まれた複数の引用符付き文字列を持つことができる私のバージョンです。結果が空で、結果が多すぎるため、確認する必要があります。厳密にテストされていません。「\」の使いすぎをお許しください。

var sample='this=that, \
sometext with quoted ",", \
for example, \
another \'with some, quoted text, and more\',\
last,\
but "" "," "asdf,asdf" not "fff\',\'  fff" the least';

var it=sample.match(/([^\"\',]*((\'[^\']*\')*||(\"[^\"]*\")*))+/gm);
for (var x=0;x<it.length;x++) {
var txt=$.trim(it[x]);
if(txt.length)
    console.log(">"+txt+'<');
}​
于 2012-07-12T01:53:44.900 に答える