2011-11-08 58 views
0

我有這樣的文字,看起來像這樣:Java的正則表達式討論

executeRule(document, 'SendEmail', [ 
    'emailAddress':'EMAIL([email protected])', 
    'subject':'Test', 
    'text':'Test', 
    'defaultText':'Test'] 
); 

我需要爲了得到該executeRule的參數用正則表達式解析它。

目前我正則表達式看起來像這樣(JAVA):

List<String> partialRules = new ArrayList<String>(); 
     List<String> rules = new ArrayList<String>(); 
     Pattern p = Pattern.compile("executeRule\\(\\s*\\w+,\\s*'(\\w+)'\\s*,\\.*"); 

問題是我無法找到一個正則表達式,將符合我的executeRule方法3'rd參數。

任何幫助表示讚賞。

謝謝。

回答

1
Pattern p = Pattern.compile("(?s)executeRule\\(\\s*?(.+?),\\s*?('.+?'),\\s*(\\[.+?\\])"); 

如果我正確理解你想要什麼。每個參數都將保存在Matcher組(i)中。

+0

你不能用逗號使用分裂,因爲第三個參數包含它。 – Zernike

+0

它很好用,謝謝 – Sergiu

+0

我怎樣才能捕捉到甚至在方法的最後?截至目前,我匹配除了最後的整個方法; 謝謝 – Sergiu

5

你想過沒有使用正則表達式一個做上述所有,但寫一個簡單的解析器拆分的逗號,然後授權給另一解析器解析每個冒號分隔的一對?構建/調試可能更容易(取決於您是否允許每個文本字符串中的逗號)。

如果您選擇擴展上面的語法,那麼這很可能不止一個(可能是相當大的)正則表達式更具可擴展性。

+0

絕對!既然你知道你將有x個參數,並且它們將以逗號分隔,並且參數中不應該有逗號,這看起來像是一個非常好的解決方案,而不是一個過於複雜的正則表達式。 –

+0

executeRule方法可以在我的文本中發生多次,並且在這些executeRule方法之間可以有不相關的文本(例如 文本文本 executeRule(X,Y,Z); 文本文本 executeRule(X,Y,Z ); – Sergiu

+0

我最喜歡引用的一個 - 有些人,當遇到一個問題,認爲「我知道,我將使用正則表達式。」現在他們有兩個問題 – Dapeng