【发布时间】:2015-05-13 09:24:45
【问题描述】:
W e 需要解析可能包含 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行之后没有任何变化,为什么?
【问题讨论】:
-
不要尝试使用正则表达式进行一般解析,使用解析器。