2 回答

TA贡献1909条经验 获得超7个赞
while您必须使用而不是遍历所有匹配项if
String ex = "(5 + 4) - 5 - (6 - (3 - 4) + (5 - (3 - 6)))";
List<String> matches = new ArrayList<>();
Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)");
Matcher matcher = pattern.matcher(ex);
while (matcher.find()){
matches.add(matcher.group(1));
}
请注意,我使用matcher.group(1)的结果将不包括括号。我也推荐使用这个 RegEx
Pattern.compile("\\(([^\\(\\)]+)\\)"); //Excluding left parentheses too

TA贡献1818条经验 获得超3个赞
我认为你很接近。根据我的测试,这应该有效:
\([^\(\)]+\)
基本上说“匹配一个'(',任意数量的不是'('或')'的字符,然后是另一个')'。
虽然,解析器经常为这些类型的任务使用堆栈结构。遍历字符串,每当你看到'('时推送并在你看到')'时弹出并存储中间的东西。我在那里概括了很多,但你明白了。一个很好的副作用是您可以轻松地在其中构建验证:如果您尝试弹出一个空堆栈,或者以仍在堆栈中的元素结束,这意味着您的表达式中有一个悬挂括号。
添加回答
举报