28

我需要拆分字符串

(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)

进入

string[0] = (age-is-25::OR::last_name-is-qa6)

字符串[1] = AND

string[2] = (age-is-20::OR::first_name-contains-test)

我尝试编写了这么多正则表达式,但没有按预期工作。

使用以下正则表达式,返回 2 但将结果分配给数组列表的 Matcher.groupCount() 返回 null 作为元素。

模式 pattern = Pattern.compile("(\\)::)?|(::\\()?");

我尝试使用 ):: 或 ::( 拆分它。

我知道正则表达式看起来太愚蠢了,但作为初学者,这是我能写的最好的。

4

5 回答 5

34

您可以使用正向前瞻和后向来匹配第一个和最后一个括号。

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)";

for (String s : str.split("(?<=\\))::|::(?=\\()"))
    System.out.println(s);

输出:

(age-is-25::OR::last_name-is-qa6)
AND
(age-is-20::OR::first_name-contains-test)

但是请注意:您似乎正在解析某种递归语言。正则表达式不擅长这样做。如果您正在进行高级解析,我建议您查看其他解析方法。

于 2012-06-11T07:02:29.813 回答
1

对我来说,你的压力很大一部分来自于在你的搜索词中转义特殊字符的需要。我强烈建议不要手动转义特殊字符,而是使用Pattern.quote(...)进行转义。

于 2012-06-11T06:55:31.837 回答
1

这应该有效

 "(?<=\\))::|::(?=\\()"
于 2012-06-11T07:12:16.067 回答
-1
textString.split("\\)::|::\\(") 

应该管用。

于 2012-06-11T06:50:23.797 回答
-1

这应该适合你。

\)::|::\(
于 2012-06-11T06:51:07.000 回答