JavaScript:按逗号拆分字符串,但忽略引号中的逗号

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

1
可能是重复的问题:JavaScript解析CSV数据的代码 - stema
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,'

上述部分内容可以被正确处理,另外一些则不能。强烈建议使用经过深思熟虑的库来避免安全漏洞或者微妙的错误,无论现在还是未来(如果您扩展代码或其他人使用它)。


正则表达式的解释:

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

注意:通过先消耗带引号的字符串再消耗不带引号的字符串,我们使不带引号的字符串更容易解析。


谢谢,它对我有效。你提到的情况并不影响我。 - Augustian Joseph
@gdoron: ('[^']+'|[^,]+) - 表示“匹配'[^']+'[^,]+'”。 '[^']+'表示“引号...一个或多个非引号...引号”。 [^,]+表示“一个或多个非逗号”。 - ninjagecko
@gdoron:同样,通过先处理带引号的字符串再处理未带引号的字符串,我们可以更轻松地解析未带引号的字符串。 - ninjagecko

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+'<');
}​

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);

1
虽然这段代码片段可能解决了问题,但包括解释真的很有帮助,以提高您的帖子质量。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人!请[编辑]您的答案以添加解释,并指出适用的限制和假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接