具有 -, ::, ( 和 ) 的正则表达式

2022-09-01 14:34:15

我需要拆分字符串

(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)

我尝试编写这么多正则表达式,但没有任何东西可以按预期工作。

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

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

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

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


答案 1

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

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)

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


答案 2

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