猿问

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

我有一个数学表达式作为字符串,例如:(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) 。我对正则表达式很陌生,所以任何帮助都将不胜感激!


慕雪6442864
浏览 116回答 2
2回答

jeck猫

while您必须使用而不是遍历所有匹配项ifString 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()){&nbsp; &nbsp; matches.add(matcher.group(1));}请注意,我使用matcher.group(1)的结果将不包括括号。我也推荐使用这个 RegExPattern.compile("\\(([^\\(\\)]+)\\)"); //Excluding left parentheses too

泛舟湖上清波郎朗

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

相关分类

Java
我要回答