Javascript:用逗号分隔字符串但忽略引号中的逗号

时间:2012-05-16 11:15:29

标签: javascript regex csv split

我有一个像

这样的字符串
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

3 个答案:

答案 0 :(得分: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,'

上述部分内容由此正确处理;其他人不是。我强烈建议人们使用一个经过深思熟虑的库来避免现在或将来出现的安全漏洞或细微漏洞(如果您扩展代码,或者其他人使用它)。


RegEx的说明:

  • ('[^']+'|[^,]+) - 表示匹配 '[^']+' [^,]+
  • '[^']+'表示引用...一个或多个非引号...引用
  • [^,]+表示一个或多个非逗号

注意:通过在不加引号的字符串之前使用带引号的字符串,我们可以更容易地解析未加引号的字符串大小写。

答案 1 :(得分: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+'<');
}​

答案 2 :(得分:0)

使用此

            var input="A,B,C,E,'F,G,bb',H,'I9,I8',J,K";
            //Below pattern will not consider comma(,) between ''. So 'I9,I8' will be considered as single string and not spitted by comma(,). 
            var pattern = ",(?=([^\']*\'[^\']*\')*[^\']*$)";
            //you will get acctual output in array
            var output[] = input.split(pattern);