具有多个字符分隔符的Java String.split

时间:2014-01-24 21:56:40

标签: java regex string

我需要解析看起来像这样的字符串

"(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 个答案:

答案 0 :(得分: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("),("));

答案 1 :(得分: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]

答案 2 :(得分:1)

正如您所提到的,您可以在),(进行拆分 - 然后,在迭代结果数组时,您只需要考虑,array[0]包含额外的(和{ {1}}包含其他array[n-1]

您还可以应用正则表达式删除前导和尾随括号,或者在分割之前使用)1的子字符串等等。