java - Java 中的嵌套正则表达式匹配

标签 java regex nested pattern-matching

我有一个场景,我想在 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/

相关文章:

regex -\w 和\b 正则表达式元字符之间的区别

python - 展平嵌套字典 - 将列表元素转换为字符串

java - 如何修复actionPerformed方法中的找不到符号?

java - Java在一定时间内创建多个线程

regex - VIM中非贪婪且固定数量的字符搜索和替换

java - 谷歌 Guava 嵌套木工

c# - 使用 AutoMapper 展平嵌套对象的更好方法?

带 GUI 的 Java 测验

java - join() 方法和《完整 Java 引用》第 9 版

javascript - Jquery 字符串与正则表达式匹配不起作用