我有一个场景,我想在 Java 中进行嵌套表达式匹配。
考虑以下表达式:
SUM_ALL(2:3,4:5)>20
其中 SUM_ALL
在应用程序中具有保留运算符含义。现在,我想从给定的表达式中提取运算符名称及其参数。为了执行相同的操作,我定义了我的模式表达式,如下所示:
Pattern testPattern = Pattern.compile("[^a-zA-Z]*([a-zA-Z_]+)\\s*\\(\\s*([0-9:,]+)\\s*\\).*");
如果表达式仅限于上述内容,则效果很好。以下是相同的输出:
Group 1: SUM_ALL
Group 2: 2:3,4:5
现在,在给定的表达式中,我可能不知道存在此类运算符的数量。例如,考虑以下情况:
SUM_ALL(4:5,6:7)>MAX(2:3,4:4)+MIN(3:4,5:7)
现在,我想提取上述每个运算符及其各自的参数,根据它们的保留含义进行计算,然后计算一个简单的数学表达式。
如果 Java 模式匹配器中有嵌套功能,那么一旦解析了运算符,就可以通过考虑表达式的其余部分来逐一提取运算符。我知道可以通过将表达式的其余部分捕获到单独的组中,然后在该组值上运行匹配器并继续执行直到到达表达式的末尾来实现这一点,但我更想知道是否模式匹配器具有相同的固有功能。
最佳答案
您可以使用这样的代码:
String str = "SUM_ALL(4:5,6:7)>MAX(2:3,4:4)+MIN(3:4,5:7)";
Matcher m =
Pattern.compile("(?i).*?([a-z_]+)\\s*\\(\\s*([\\d:,]+)\\s*\\)").matcher(str);
while (m.find())
System.out.printf("%s :: %s%n", m.group(1), m.group(2));
输出:
SUM_ALL :: 4:5,6:7
MAX :: 2:3,4:4
MIN :: 3:4,5:7
关于java - Java 中的嵌套正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13067062/