java - 正则表达式无法匹配 switch case 模式

标签 java regex parsing groovy

W 我们需要解析可能包含 switch case 指令的规则。

当我们考虑使用 Groovy 在 Java 代码中实现这个解析器时,我在 Groovy 中编写了以下代码:

1. class RuleParser {
2. String functionRegex = /(frml[0-9]*)((\s*@[a-zA-Z0-9_]*\s*)?(,\s*@[a-zA-Z0-9_]*\s*)*)/
3. String variableRegex = /@[a-zA-Z0-9_]*/
4. String numberRegex = /\s+[0-9]+/
5. String switchRegex = /switch(\s*1\s*)((\s*|\n)case)+((\s*|\n)default)?/
6. String caseRegex = /case\s*1\s*:\s*1/
7. String defaultRegex = /default\s*:\s*1/
8. String conditionRegex = /1(>=|<=|>|<|==|!=)1/

9. testRule(String rule){
10.       try {
11.          rule.eachMatch(numberRegex){ match->
12.             rule=rule.replaceAll(match, ' 1');
13.          }
14.          rule.eachMatch(functionRegex){ match->
15.             rule=rule.replaceAll(match, '1');
16.          }
17.          rule.eachMatch(variableRegex){ match->
18.             rule=rule.replaceAll(match, '1');
19.          }
20.          rule.eachMatch(defaultRegex){ match->
21.             rule=rule.replaceAll(match, 'default');
22.          }
23.          rule.eachMatch(caseRegex){ match->
24.             rule=rule.replaceAll(match, 'case');
25.          }
26.          rule.eachMatch(switchRegex){ match->
27.             rule=rule.replaceAll(match, '1');
28.          }
29.          Eval.me(rule)
30.          println "run successfully"
31.       } catch (Exception e) {
32.          e.printStackTrace()
33.       }
34.    }
35. }

首先,我只是想测试输入规则,以了解它是否根据我们的结构正确,例如,我考虑了下面的规则示例来跟踪代码是否正常工作:

switch(@prm43) 
case 12: @msg13
case 14: @msg32
default: @msg100

它一直工作到第 26 行,当到达第 26 行时,规则是:

switch(1) 
case
case
default

尽管它完全遵循switchRegex的模式,但在第28行之后没有任何变化,为什么?

最佳答案

很抱歉没有对您的问题给出直接答案,但我似乎有点不清楚您想要实现的目标。您在进行一些替换后评估规则,但您的开关不是合法的 groovy(或 java)。 switch 后面需要跟大括号。此外,我会尝试利用 groovy 的 DSL 功能而不是制作解析器。如果解析器确实是您所需要的(缺少有关动机和上下文的信息),那么我建议使用像 jparsec 这样的组合器解析器:

https://github.com/jparsec/jparsec

用 jparsec 描述语法非常容易,而且非常易于维护。无论如何,使用正则表达式来解决这个问题看起来就像是一个钉子,因为我们只有一把锤子。

关于java - 正则表达式无法匹配 switch case 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30210679/

相关文章:

javascript - 将对象 ID 传递到 session 存储

java - 在 OSGi 中更好地处理线程上下文类加载器

java - 如何在 Java 中使用调试选项进行编码

javascript - 正则表达式javascript,从某个位置匹配并跳过包含注释 block 的行

Java正则表达式拆分字符串

mysql - 查找字符串 mySQL 中匹配表达式的数量

javascript - 使用 AJAX 解析有效的 JSON?

c# - 为什么 Roslyn 每种语言都有两个版本的语法?

java - 是否使用RMI来调用Web服务

Java 命名查询