2014-03-07 135 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