【问题标题】:Javascript: Splitting a string by comma but ignoring commas in quotesJavascript:用逗号分割字符串但忽略引号中的逗号
【发布时间】:2012-05-23 22:45:48
【问题描述】:

我有如下字符串

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

【问题讨论】:

标签: javascript regex csv split


【解决方案1】:

使用这个

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

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,包括解释 really helps 以提高您的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
【解决方案2】:

这是我的版本,它可以使用单引号和双引号,并且可以包含多个嵌入逗号的引号字符串。它给出的结果是空的,而且结果太多,所以你必须检查一下。没有经过严格测试。请原谅过度使用'\'。

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

【讨论】:

    【解决方案3】:
    > 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,'

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


    正则表达式的解释:

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

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

    【讨论】:

    • 谢谢,它对我有用。你提到的情况对我没有影响
    • @gdoron: ('[^']+'|[^,]+) - 意思是“匹配'[^']+'[^,]+”。 '[^']+' 表示“引用...一个或多个非引用...引用”。 [^,]+ 表示“一个或多个非逗号”。
    • @gdoron:同样通过在未引用字符串之前使用引用字符串,我们可以更轻松地解析未引用字符串的大小写。
    猜你喜欢
    • 2017-04-07
    • 2012-07-12
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多