2012-06-11 32 views
28

我需要拆分字符串用正则表达式 - ,::,(和)

(年龄为25 ::或::姓氏,是-QA6):: AND::(年龄是-20 :: OR ::如first_name-包含检验)

串[0] =(年龄是-25 :: OR ::姓氏-是-QA6)

string [1] = AND

串[2] =(年龄为20 ::或:: FIRST_NAME,包含测试)

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

使用以下正则表达式,Matcher.groupCount()返回2,但将结果指定给arraylist返回null作为元素。

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

我试着用拆分的话)::或::(

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

+3

概括这个问题就相当于解析表达式与正则表达式,这是不可能的:正则表达式是不是足够强大。 – dasblinkenlight

+8

如果你真的尝试过一些东西,这并不是愚蠢的事情:)在询问之前首先尝试某些东西的好工作。 – Ewald

+0

只有在'AND'附近''才能将它分解,而不必将'AND'放入分离器? – dantuch

回答

36

您可以使用积极lookahead和lookbehead匹配第一个和最后一个括号。

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) 

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

+8

)这是一个很好的主意,它是第一个不会进行疯狂猜测的回答者。他显然更熟悉先进的正则表达式,但他仍然在测试,其余部分就像“试试这个,如果你幸运的话它就可以工作” – MarioDS

+1

@dacwe真的是一个聪明的回答伙伴,它+1。 –

+0

@dacwe:非常感谢!顺便说一句,我确实nt理解正则表达式中?<=和?=的用法。我从来没有见过任何教程中的人。你能解释一下吗?或者你可以指出一些网址,我可以从那里获得一些信息?再次感谢。 – aradhak

-1
textString.split("\\)::|::\\(") 

应该工作。

+0

反斜杠出现两次...不知道为什么格式化是删除我的第二个反斜杠 – ManojGumber

+3

如果格式化与你的代码搞乱使它成为一个代码块,或使用像这样的''这样的'' – dantuch

+0

它不会包含在)第一个字符串和(在第三个字符串 –

-1

这应该为你工作。

\)::|::\(
1

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

1

这应该工作

"(?<=\\))::|::(?=\\()"