我需要解析看起来像这样的字符串
"(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执行此操作?如果我使用逗号作为分隔符,它也会分割单词。我想用分隔符“)分割它们,(”。我该怎么做?
由于
答案 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
方法,您将获得一个包含一个空单元格的数组。请改用Pattern
和Matcher
类。
请尝试使用此代码:
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
的子字符串等等。