首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在括号之间获取字符串,不包括其他部分

在括号之间获取字符串,不包括其他部分
EN

Stack Overflow用户
提问于 2019-01-10 19:53:12
回答 2查看 69关注 0票数 0

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

我试图使用regex提取不包含其他括号的括号中的表达式。在这种情况下,它将(5 + 4),(3-4),(3-6)。

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

到目前为止,我已经:

代码语言:javascript
复制
    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,因此,任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-10 20:07:17

必须使用while而不是if迭代所有匹配。

代码语言:javascript
复制
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进行推荐。

代码语言:javascript
复制
Pattern.compile("\\(([^\\(\\)]+)\\)"); //Excluding left parentheses too
票数 3
EN

Stack Overflow用户

发布于 2019-01-10 20:07:51

我觉得你们很亲密。从我测试的结果来看,这应该是可行的:

代码语言:javascript
复制
\([^\(\)]+\)

它基本上是说“匹配a '(',任何数量的字符不是'(‘或')',然后是另一个')’。

尽管如此,解析器通常为这类任务使用堆栈结构。迭代字符串,每当你看到'(‘’和当你看到‘’时弹出‘’时推送,并将这些东西存储在中间。我在这里做了很多概括,但你明白。一个很好的副作用是,您可以轻松地在其中构建验证:如果您试图弹出一个空堆栈,或者在堆栈中以元素结尾,这意味着您的表达式中有一个挂起的括号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54136013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档