我有一些字符串:
(((a * b) + c) * d)
并希望使用java regex捕获带括号的组。我以为这个简单的正则表达式
Pattern p = Pattern.compile("\\((.*)\\)",Pattern.DOTALL);
会做这项工作,但事实并非如此。
那有什么不对吗?
答案 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可能会获得更多成功。