1

我有一个场景,我想在 Java 中进行嵌套表达式匹配。

考虑以下表达式:

SUM_ALL(2:3,4:5)>20

whereSUM_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 模式匹配器中有嵌套功能,那么一旦解析了运算符,就可以通过考虑表达式的其余部分来帮助逐个提取运算符。我知道可以通过在一个单独的组中捕获表达式的其余部分然后在该组值上运行匹配器并继续这样做直到我们到达表达式的末尾来做到这一点,但我更想知道是否模式匹配器具有相同的固有功能。

4

2 回答 2

1

好吧,有这个:

(?:(SUM_ALL|MAX|MIN|addmorehere)\\(((?:\d+:\d+,?){2})\\)[+-><*/addmorehere]?)+

它并没有真正适用于 java 或任何语言,但你明白了

于 2012-10-25T11:09:29.440 回答
1

你可以使用这样的代码:

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
于 2012-10-25T11:12:52.510 回答