2015-10-12 44 views
1

如果它是一個字符串,我當前的正則表達式應該得到特定PHP函數的返回值。非貪婪正則表達式不會終止

我的第一個正則表達式工作,但我知道它不匹配所有情況,所以我想擴大它。

這是第一個正則表達式:

"public function getVersion\\(\\)\\s*?{\\s*.*return\\s*'(.+)';" 

這適用於:

public function getVersion() { 
    return '1.0.0'; 
} 

但不適合例,其中有函數名和回報之間的線路:

public function getVersion() { 
    # SomeComment 
    some_function() 
    return '1.0.0'; 
} 

以下是大修版本:

"public function getVersion\\(\\)\\s*?{(\\s|.)*?return\\s*'(.+)';" 

我使用(\ s |。)*將其更改爲匹配返回前的任意數量的字符或換行符?

雖然實現它,但我發現搜索不會終止。我不確定爲什麼會這樣。即使沒有找到結果,它是否應該在到達搜索文本結尾後終止?任何人都可以幫助我嗎?

+0

不要使用'(\ s |。)',只需使用're.S',以便一個點可以匹配一個換行符。但我認爲這個正則表達式不是解析代碼的正確方法。 –

+0

@stribizhev我想解析沒有正則表達式的代碼。還有什麼替代方案?我還沒有找到一個python庫來解析PHP代碼,而自己寫一個會花費很多時間。 –

+1

我不是代碼解析專家,我可以在網上找到[phply](https://github.com/ramen/phply)。 –

回答

2

您可以對換行符使用re.DOTALL參數。考慮這個:

import re 

text = '''public function getVersion() { 
    # SomeComment 
    some_function() 
    return '1.0.0'; 
}''' 

regex_comp = re.compile("public function getVersion\\(\\)\\s*?{\\s*.*return\\s*'(.+)';", re.DOTALL) 

print regex_comp.search(text).group(1)