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

Aug*_*eph 5 javascript regex csv split

我有一个像下面这样的字符串

var str="A,B,C,E,'F,G,bb',H,'I9,I8',J,K"
Run Code Online (Sandbox Code Playgroud)

我想在逗号上拆分字符串.但是,如果某些内容在单引号内,我需要它来忽略逗号,如下所示.

 A
 B
 C
 E
 F,G,bb
 H
 I9,I8
 J
 K
Run Code Online (Sandbox Code Playgroud)

nin*_*cko 12

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

虽然您要求这样做,但您可能没有考虑角落案例,例如:

  • 'bob\'s'是一个'转义的字符串
  • a,',c
  • a,,b
  • a,b,
  • ,a,b
  • a,b,'
  • ',a,b
  • ',a,b,c,'

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


RegEx的解释:

  • ('[^']+'|[^,]+)- 意味着匹配 '[^']+' [^,]+
  • '[^']+'是指...一个或多个非报价...报价.
  • [^,]+表示一个或多个非逗号

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


小智 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+'<');
}?
Run Code Online (Sandbox Code Playgroud)