如何使用正则表达式将字符串拆分为数组(使用不在括号内的逗号)?

时间:2015-03-02 23:36:34

标签: java regex

我需要将一个字符串拆分成数组。

String test = "test (18,2,3) ,(,Test (,)), Test"; 

我希望用不在括号内的逗号分隔。这就是我需要的东西

 test (18,2,3)
 (,Test (,)) 
 Test 

我试过

          String test = "test (18,2,3) , (,Test (,)) , Test"; 
          String colVals [] = test.split("[^(.*,.*)] | ,");
          System.out.println(colVals[0]);
          System.out.println(colVals[1]);
          System.out.println(colVals[2]); 

但结果不是我所期待的

1 个答案:

答案 0 :(得分:1)

我不知道您是否可以控制CSV格式;如果没有,请忽略这个答案。

你应该有一个用CSV转义文字逗号的系统。不幸的是,没有单一的标准可以做到这一点。有些人使用反斜杠:

test (18\,2\,3) ,(\,Test (\,)), Test

其他人使用可选的引号:

"test (18,2,3) ","(,Test (,))", Test

另一种选择是使用制表符而不是逗号,如果您知道不存在任何文字制表符(或者如果有,则将其更改为\t)。我将使用->来表示制表符:

test (18,2,3) ->(,Test (,))-> Test

注意:这些是字符串本身 - 字符串文字需要进一步转义:test = "test (18\\,2\\,3) ,(\\,Test (\\,)), Test"test = "\"test (18,2,3) \",\"(,Test (,))\", Test"test = "test (18,2,3) \t(,Test (,))\t Test"

如果您使用这些方法之一,您可能会找到用于解析CSV的库。或者,如果您使用标签而不是逗号,只需按照之前的操作进行操作,然后拆分标签。

如果你手上有太多时间,你可以尝试自己写点什么来做。我不认为它可以以相同的方式完成 - 但是你必须编写一个与逗号之间的子串(而不是逗号本身)匹配的正则表达式,然后创建一个java.util.regex .Matcher对象,使用matcher.find()遍历字符串,并对匹配的子字符串中包含的任何反斜杠进行unescape。