获取括号之间的字符串,但不包括其他括号

时间:2019-01-10 19:53:12

标签: java regex

我有一个数学表达式作为字符串,例如: (5 + 4)-5-(6-(3-4)+(5-(3-6)))

我正在尝试使用正则表达式来提取不包含其他括号的括号内的表达式。在这种情况下,它将是(5 + 4),(3-4),(3-6)。

我认为有两种可能的方法: 1.排除也包含括号或 2.仅包括字符串包含数字或+,-,/,*的匹配项。 (3 * 4),(5/6),(3)等...

到目前为止,我有:

    String ex = "(5 + 4) - 5 - (6 - (3 - 4) + (5 - (3 - 6)))";
    String match = "";

    Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)");
    Matcher matcher = pattern.matcher(ex);
    if(matcher.find()){
        match = matcher.group();
    }

我只得到(5 + 4)。我是regex的新手,所以我们将不胜感激!

2 个答案:

答案 0 :(得分:3)

您必须使用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

答案 1 :(得分:1)

我认为您已经很接近了。根据我的测试,这应该有效:

\([^\(\)]+\)

基本上说“匹配一个'(',匹配非'('或')'的任意数量的字符,然后匹配另一个')'。

尽管如此,解析器通常为这些任务采用堆栈结构。遍历字符串,每当看到“(”)时推送,并在看到“)”时弹出,然后将它们存储在它们之间。我在那里总结了很多,但您明白了。一个不错的副作用是您可以轻松地在其中建立验证:如果您尝试弹出一个空堆栈,或者以堆栈中的元素结尾时结束,这意味着您的表达式中带有括号。

相关问题