2012-10-25 71 views
1

我有一個場景,我想要在Java中進行嵌套表達式匹配。在Java中嵌套正則表達式匹配

考慮以下表達式:

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

其中SUM_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模式匹配器中有嵌套功能,一旦操作符被解析,它將幫助一個接一個地提取操作符,並考慮表達式的其餘部分。我知道有可能通過在一個單獨的組中捕獲表達式的其餘部分,然後在該組值上運行匹配器並繼續這樣做直到我們到達表達式的末尾,但是我會更有興趣知道是否可以這樣做模式匹配器具有相同的固有功能。

+2

當管理這些可以有自由格式的公式時,您應該開始查看詞法分析器/解析器,例如Parboiled或Javacc ... – PhiLho

+0

...或[ANTLR](http://www.antlr.org/) ,一個用於解析自己的語法的好工具 –

+1

學習Java正則表達式(以及Perl,.NET,PHP/PCRE等)絕對最好的資源當然是這本書:[Mastering Regular Expressions(3rd Edition)](http ://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124「有關正則表達式的最佳書籍 - 永遠!」)由Jeffrey Friedl提供。交出我讀過的最有用的書。 – ridgerunner

回答

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)); 

OUTPUT:

SUM_ALL :: 4:5,6:7 
MAX :: 2:3,4:4 
MIN :: 3:4,5:7 
+1

感謝您的精彩回答。你可以請建議一些好的來源閱讀正則表達式和解析在Java中? –

+1

Java官方文檔:http://docs.oracle.com/javase/tutorial/essential/regex/和本教程在這裏:http://www.vogella.com/articles/JavaRegularExpressions/article.html是很好的起點。 – anubhava

+0

謝謝!這些非常有用。 –

1

好了,有這樣的:

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

它並不真正scaped爲Java或任何語言,但你的想法