如何使用java正则表达式捕获带括号的组

时间:2010-12-03 14:12:41

标签: java regex

我有一些字符串:

(((a * b) + c) * d)

并希望使用java regex捕获带括号的组。我以为这个简单的正则表达式

Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);

会做这项工作,但事实并非如此。

那有什么不对吗?

3 个答案:

答案 0 :(得分:3)

您尝试使用正则表达式定义的语言不幸会出现非规则性,即正则表达式不适合此类表达式。 (确切地说,“良好平衡的括号”不是你可以用正则表达式定义的东西。)

如果你只是想在你的例子中找到子串a * b,那么下列表达式应该这样做:

Pattern p = Pattern.compile("\\(([^()]*)\\)");
Matcher m = p.matcher("(((a * b) * ) + c) * d)");
if (m.find())
    System.out.println(m.group(1));   // prints "a * b"

答案 1 :(得分:1)

正则表达式并不擅长选择像括号一样的平衡对。在没有正则表达式的情况下解析字符串会更好。

答案 2 :(得分:1)

我认为使用RegEx处理嵌套结构几乎是不可能的。更好地迭代每个角色并跟踪你拥有多少个开放式括号。

另外,如果您的目标是评估infix notation中的数学表达式,那么使用shunting algorithm可能会获得更多成功。