2012-11-07 283 views
2

我想要分割基于逗号排除其中之一是在双引号,也如果存在任何相邻的逗号它们应该算作分隔标记的字符串字符串分割排除逗号在双引号和分割相邻逗号

我能够对逗号进行字符串分割,不包括使用正则表达式的双引号的字符串分割[^,\"']+|\"([^\"]*)\"

但是如果存在相邻的逗号,它将无法正确标记。字符串 例如

one,two,three,four,"five1,five2", six ,seven,"eight1,eight2","nine",,eleven 

输出应该

one 
two 
three 
four 
five1,five2 
six 
seven 
eight1,eight2 
nine 

eleven 

请帮助

回答

6

如果你所有的报价是匹配的,每一个逗号,你想在之后,将偶数分裂的"。所以,你可以使用一个超前和东西这件事情到myString.split(pattern, -1)

,(?=(?:(?:[^\"]*\"){2})*[^\"]*$) 

此,如果有一个甚至有问题的逗号和字符串的结尾之间的一些"将只匹配。

注意,-1论据split是很重要的,否则尾随空字符串将被省略。注意:我不知道Java正则表达式引擎优化的效果如何,所以如果它失败了,这个前瞻可能是非常低效的,因为它不必要地回溯。如果您遇到性能问题,请尝试使量词所有格:

,(?=(?:(?:[^\"]*+\"){2})*+[^\"]*+$) 

这将停止引擎回溯。

+0

非常感谢回复,这种模式是在想要的标记中分割字符串,但它发出双引号,我的期望是正则表达式会从结果数组中删除双引号。 – banjara

+0

@zuxqoj啊对。我会在结果中用'trim()'每个字符串,然后用'^ \“(。*)\”$'和替换'$ 1'替换'replaceFirst()'。或者,将初始模式更改为'\“?,(?=(?:(?:[^ \”] * \“){2})* [^ \”] * $)\“?' –