2014-03-07 77 views
1

我有兴趣使用正则表达式解析Drools规则文件。 有与整个.drl文件的内容的字符串,我想有4子:用Java正则表达式解析Drools规则文件

  1. <name>
  2. 的子字符串的内容与<attribute>
  3. A的含量子串子与<conditional element>
  4. 的子字符串的内容与内容<action>

一个Drools的规则有后续荷兰国际集团的结构,根据official documentation

rule "<name>" 
    <attribute>* 
when 
    <conditional element>* 
then 
    <action>* 
end 

我已经使用这种模式尝试,但目前还没有行之有效:

^rule"(.|\n|\r|\t)+"(.|\n|\r|\t)+\bwhen\b(.|\n|\r|\t)+\bthen\b(.|\n|\r|\t)+\bend\b?$ 

没有人有我怎么可能进行的想法?

+2

'.' can匹配行分隔符以外的任何内容。如果你想让'.'来匹配它们,而不是'。\ n | \ r | \ t'来简单的使用'.',那么'Pattern.DOTALL'标志就会添加到你的正则表达式中。另外''但它运作不好'并不是描述你面对这个正则表达式问题的最好方法。你能解释你如何使用这个正则表达式,你的输入,输出和预期输出是什么?我怀疑'(。| \ n | \ r | \ t)+'是贪婪的问题,可以匹配任何东西。 – Pshemo

+0

我会考虑看看javacc的任何类型的复杂解析。 –

回答

2

你差不多了。这项工作:

^rule\s+\"(.|\n|\r|\t)+\"(.|\n|\r|\t)+\bwhen\b(.|\n|\r|\t)+\bthen\b(.|\n|\r|\t)+\bend\b?$ 

另一种解决方案:

^\s*rule\s+\"([^\"]+)\"[\s\S]+\s+when\s+([\s\S]+)\s+then\s+([\s\S]+)\send\s*$ 

注意:您错过了空间和 “ - > \”

提示:

  • 您可以使用\ S为空白字符。
  • [^ \“]所有非”字符。
  • [\ s \ S]适用于所有角色。
  • \ b停在[a-zA-Z0-9_]。 \ s +停止任何非空白字符。这只是一个额外的预防措施,如果任何属性以特殊字符开头。
  • 使用类似Rad Software Regular Expression Designer的程序。这将大大简化编辑和测试您的正则表达式代码。
4

我知道你的问题是关于正则表达式,但我强烈建议不要使用它。有太多的情况下,你的正则表达式会失败...例如,单个单词的规则名称不需要“”,规则关键字不需要是行中的第一件事,等等......

/*this is a comment on the start of the line*/ rule X... 

相反的正则表达式,只需直接使用DrlParser,它会给你的所有信息,你需要:

String drl = "package foo \n" 
       + "declare Bean1 \n" 
       + "field1: java.math.BigDecimal \n" 
       + "end \n" 
       + "rule bigdecimal\n" 
       + "when \n" 
       + "Bean1(field1 == 0B) \n" 
       + "then \n" 
       + "end"; 

DrlParser parser = new DrlParser(LanguageLevelOption.DRL6); 
PackageDescr pkgDescr = parser.parse(null, drl); 

PackageDescr.getRules()会给你所有的RuleDescr文件中,每个RuleDescr有一个getName()来给你规则名称等所有类型的安全,没有边缘情况下等。

+0

我有类似的代码。唯一的一点变化是在块中的规则条件。我的行为不一致。如果我使用str [startsWith],解析器会抛出错误101 - 规则中的输入'str'不匹配。如果我使用==条件,分析器的作品。然后它开始为str [startsWith]条件工作。不知道为什么会这样。 – palkars