为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2022-04-28 16:46:53
我有一个数学表达式作为字符串,例如:(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) 。我对正则表达式很陌生,所以任何帮助都将不胜感激!
查看完整描述

2 回答

?
jeck猫

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


查看完整回答
反对 回复 2022-04-28
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

我认为你很接近。根据我的测试,这应该有效:

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

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

虽然,解析器经常为这些类型的任务使用堆栈结构。遍历字符串,每当你看到'('时推送并在你看到')'时弹出并存储中间的东西。我在那里概括了很多,但你明白了。一个很好的副作用是您可以轻松地在其中构建验证:如果您尝试弹出一个空堆栈,或者以仍在堆栈中的元素结束,这意味着您的表达式中有一个悬挂括号。


查看完整回答
反对 回复 2022-04-28
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号