【发布时间】: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
我有如下字符串
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
使用这个
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);
【讨论】:
这是我的版本,它可以使用单引号和双引号,并且可以包含多个嵌入逗号的引号字符串。它给出的结果是空的,而且结果太多,所以你必须检查一下。没有经过严格测试。请原谅过度使用'\'。
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+'<');
}
【讨论】:
> str.match(/('[^']+'|[^,]+)/g)
["A", "B", "C", "E", "'F,G,bb'", "H", "'I9,I8'", "J", "K"]
尽管您要求这样做,但您可能没有考虑到极端情况,例如:
'bob\'s' 是一个字符串,其中 ' 被转义a,',ca,,ba,b,,a,ba,b,'',a,b',a,b,c,'上面的一些是正确处理的;其他人不是。我强烈建议人们使用经过深思熟虑的库,以避免现在或将来(如果您扩展您的代码,或者如果其他人使用它)等安全漏洞或细微错误。
正则表达式的解释:
('[^']+'|[^,]+) - 表示匹配任一 '[^']+' 或 [^,]+
'[^']+' 表示引用...一个或多个非引用...引用。 [^,]+ 表示一个或多个非逗号
注意:通过在不带引号的字符串之前使用带引号的字符串,我们可以更容易地解析不带引号的字符串。
【讨论】:
('[^']+'|[^,]+) - 意思是“匹配'[^']+' 或[^,]+”。 '[^']+' 表示“引用...一个或多个非引用...引用”。 [^,]+ 表示“一个或多个非逗号”。