2014-01-24 31 views
3

我有我需要解析看起来像这样Java的String.split与多个字符分隔符

"(1,0,quote),(1,0,place),(1,0,hall),(2,0,wall)" 

我想将字符串分割成三胞胎的块,让我得到

1,0,quote 
1,0,place 
1,0,hall 
2,0,wall 

如何使用String.split执行此操作?如果我使用逗号作为分隔符,它也会分割这些词。我想用分隔符“),(”我怎样做这个

感谢

+3

使用正则表达式或写一个真正的解析器,如果你需要处理任意嵌套'()'秒。或者使用已经解决了这个问题的真正的序列化:JSON。 –

+2

为什么不删除第一个和最后一个字符,然后用')分割它们,('就像你说的那样? – crush

回答

2

使用split方法,您将得到一个包含一个空单元格的数组。改为使用PatternMatcher类。

试试这个代码,而不是:

String s = "(1,0,quote),(1,0,place),(1,0,hall),(2,0,wall)"; 
Pattern p = Pattern.compile("\\d+,\\d+,[^)]+"); 
Matcher m = p.matcher(s); 

List<String> l=new ArrayList<>(); 
while(m.find()) { 
    l.add(m.group()); 
} 

System.out.println(l); 

输出

[1,0,quote, 1,0,place, 1,0,hall, 2,0,wall] 
+0

谢谢,它工作。 – iamseiko

+0

@ Franzd'Anconia不客气;) – Stephan

1

正如你所说,你可以在),(分裂,分裂他们? - 遍历结果数组时,那么,只有你需要考虑到,那array[0]包含一个附加(array[n-1]包含一个额外的)

你也可以应用正则表达式来删除前缘和后支架,第一或使用子从1n-2分裂之前,等等。 ..

3

如果用),(分割你的字符串,你会不会在你的字符串的结尾移除开始()。考虑使用Pattern和Matcher类来查找()之间的元素。

String text = "(1,0,quote),(1,0,place),(1,0,hall),(2,0,wall)"; 

Pattern p = Pattern.compile("\\(([^)]+)\\)"); 
Matcher m = p.matcher(text); 
while(m.find()) { 
    System.out.println(m.group(1)); 
} 

输出:

1,0,quote 
1,0,place 
1,0,hall 
2,0,wall 

如果你真的想在),(使用split您将需要手动删除第一(和最后)(分裂只会移除所有将被拆分的一部分)。你也必须避免使用括号)(,因为它们是正则表达式元字符(例如用于创建组)。为此,您可以在每个)(之前手动添加\\,或者您可以用\\Q\\E围绕),(将这些元素之间的字符标记为文字。但是你不必手动执行此操作。只需使用Pattern.quote生产正则表达式与逃脱所有的元字符,并以此为split参数一样

//I assume that `text` already removed `(` and `)` from its start and end 
String[] array = text.split(Pattern.quote("),(")); 
+0

+1简单有效,比拆分好得多 – anubhava

+0

是的。我实际上做了一个更具体的正则表达式\(([^,] + [,]){2} [^,] + \)。它还排除了名称中有括号的情况。 – iamseiko

+0

@ Franzd'Anconia对正则表达式的一点优化,'',''可以简单地用','替换。 – Stephan