Java中使用多个字符作为分隔符的字符串拆分方法:String.split

3
我有一些需要解析的字符串,看起来像这样:
"(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。 - Matt Ball
2
为什么不先移除第一个和最后一个字符,然后按照 ),( 进行分割呢? - crush
3个回答

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方法,你需要手动删除第一个“(”和最后一个“)”,因为split只会删除应该分割的部分。此外,你还需要转义括号“)”和“(”,因为它们是正则表达式元字符(例如用于创建组)。为了做到这一点,你可以在每个“)”和“(”前面手动添加“\\”,或者你可以用“\\Q”和“\\E”将“),(”括起来,以将这些元素之间的字符标记为文字。但你不必手动完成这个过程。只需使用Pattern.quote来生成带有所有元字符的转义符的正则表达式,并将其用作split方法的参数,如下所示:
//I assume that `text` already removed `(` and `)` from its start and end 
String[] array = text.split(Pattern.quote("),("));

是的。我实际上制作了一个更具体的正则表达式 (([^,]+[,]){2}[^,]+)。它还排除了名称带括号的情况。 - sparkonhdfs
@Franzd'Anconia 对于正则表达式的一点优化,[,] 可以简单地替换为 , - Stephan

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]

1
正如你所提到的,你可以在),(处进行拆分 - 然后,在迭代结果数组时,你只需要考虑到array[0]包含一个额外的(array[n-1]包含一个额外的)
你也可以应用正则表达式来删除前导和尾随括号,或者在拆分之前使用从1n-2的子字符串等方法...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接