我有一个字符串的数学表达式,例如:(5 + 4) -5- (6 - (3 - 4) + (5 - (3 -6)
我试图使用regex提取不包含其他括号的括号中的表达式。在这种情况下,它将(5 + 4),(3-4),(3-6)。
我认为有两种可能的方法: 1.排除也包含括号或2的匹配。只包括字符串包含数字或+、-、/、* ie的匹配。(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,因此,任何帮助都将不胜感激!
发布于 2019-01-10 20:07:17
必须使用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发布于 2019-01-10 20:07:51
我觉得你们很亲密。从我测试的结果来看,这应该是可行的:
\([^\(\)]+\)它基本上是说“匹配a '(',任何数量的字符不是'(‘或')',然后是另一个')’。
尽管如此,解析器通常为这类任务使用堆栈结构。迭代字符串,每当你看到'(‘’和当你看到‘’时弹出‘’时推送,并将这些东西存储在中间。我在这里做了很多概括,但你明白。一个很好的副作用是,您可以轻松地在其中构建验证:如果您试图弹出一个空堆栈,或者在堆栈中以元素结尾,这意味着您的表达式中有一个挂起的括号。
https://stackoverflow.com/questions/54136013
复制相似问题