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,'

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


正则表达式的解释:

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

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

于 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 回答
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);
于 2016-11-11T13:18:39.167 回答