2017-08-31 49 views
-1

我有這種方法的簽名我想分析:正則表達式匹配這種方法簽名

.method [list of words than can or cant appear] MethodName([List of params])ReturnType 

在這裏舉例的2周方法的簽名我需要解析:

.method Paracasa(Ljava/lang/String;I)V 
.method public static OnDone()V 

的主要問題是.method和MethodName之間出現的詞可以存在或不存在,如果它們存在,我需要捕獲它們。我有一個解決方案,但我相信會有一個更清晰的解決方案,我想知道。我的解決辦法是

\.method(?:\s+(.*)\s+|\s+)(.+)\((.*)\)\s*(.*) 

正如你可以看到我已經添加了兩個選擇,我的意思是,如果出現這個羣體。方法和方法名之間的話也沒有。但對我來說似乎很骯髒。

難道可以通過另一種方式嗎?

在此先感謝。

+0

我們在這裏討論的是java方法的名字,所以你想要匹配像public,private,protected,static等關鍵字? –

+0

嗯,沒有。你是對的這來自一個java源代碼,但這是smali,在[可能或不能出現的單詞列表]我已經看到與java關鍵字不匹配的東西(現在不能重新註冊)。所以這就是爲什麼我想要捕捉這部分中的所有文本以保證安全。 – Notbad

回答

0
\.method\s+(.*?)\s*(\w+)\((.*)\)(\w+) 

非常類似於你的正則表達式。

\.method\s+ 
(.*?) # non-greedy match, matches only extra keywords like public etc. 
\s* # so the previous non-greedy match won't match trailing space 
(\w+) # I suppose method names can only be alphanumeric or underscore 
\((.*)\) # May cause problems if list of params include another parentheses - is no longer "regular" language 
(\w+) # Same as with method name, only alphanumeric or underscore? 

我最關心的是在參數列表括號,因爲它將使這個問題不宜對正則表達式(雖然可能可能的一些擴展)。另外,如果您想更嚴格地解析方法名稱和返回類型,則可以使用([A-Za-z_][A-Za-z_0-9]*)而不是(\w+)。就我所知,這是大多數語言中標識符名稱的常用正則表達式。

+0

爲什麼說「我最關心的是參數列表中的圓括號,因爲它會使這個問題不適合正則表達式」?你的意思是,捕獲未知數量的參數嗎? – Notbad

+1

@Notbad我沒有意識到它是方法聲明(不是方法調用),所以參數列表中的另一個括號可能無效。我的意思是括號內的另一個括號,這會對我和你的正則表達式造成麻煩。 –