2015-05-02 73 views
0

我想獲得一個正則表達式來匹配多行與多行模式,但它保持匹配的一切。比如我想匹配兩次驗證碼:正則表達式多行不處理重複模式

STDMETHOD(MyFunc)(
D2D1_SIZE_U size, 
_In_opt_ CONST void *srcData, 
) PURE; 

STDMETHOD(MyFunc2)(
_In_opt_ CONST void *srcData2, 
UINT32 pitch2, 
) PURE; 

我跟着這個鏈接:

How do I match any character across multiple lines in a regular expression?

,並用這種模式提出了:

\bSTDMETHOD\b((.|\n|\r)*)\bPURE\b 

但它不工作。 ((.|\n|\r)*)匹配整個事情。我希望當它發現「純」時停止。換句話說,適當的匹配會給我兩次上面代碼的匹配,但是我的表達只停留在最後一個「純」關鍵詞上,只做一次匹配。

讓我知道你是否明白爲什麼它不起作用。

+0

閱讀「懶惰,而不是貪婪」的開頭和結尾:HTTP://www.regular-expressions .info/repeat.html –

回答

0

你應該使用Lazy quantifiers,因爲他們停在第一場比賽他們發現:

\bSTDMETHOD\b((.|\n|\r)*?)\bPURE\b 

測試在Regexr.com

enter image description here

+0

謝謝你回答我的其他帖子了! – gmmo

+0

哈哈,沒問題 –

+0

順便說一句,如果解決了你的問題並提出了幫助你的答案 –

0

相反的(.|\n|\r)*,使用.*?(點與非貪婪修飾符?)並添加sg標誌,如下所示:

/\bSTDMETHOD\b(.*?)\bPURE\b/sg 

s標誌意味着符合.\r\ng標誌讓你捕捉的主題文本所有匹配的字符串。

Demo

0

在Python,嘗試:

txt='''\ 
STDMETHOD(MyFunc)(
D2D1_SIZE_U size, 
_In_opt_ CONST void *srcData, 
) PURE; 

STDMETHOD(MyFunc2)(
_In_opt_ CONST void *srcData2, 
UINT32 pitch2, 
) PURE;''' 

import re 

for i, m in enumerate(re.finditer(r'\bSTDMETHOD\b(.*?)\bPURE\b', txt, flags=re.S | re.M)): 
    print 'Match {}:\n{}\n==='.format(i, m.group(1)) 

打印:

Match 0: 
(MyFunc)(
D2D1_SIZE_U size, 
_In_opt_ CONST void *srcData, 
) 
=== 
Match 1: 
(MyFunc2)(
_In_opt_ CONST void *srcData2, 
UINT32 pitch2, 
) 
=== 

注意正則表達式\bSTDMETHOD\b(.*?)\bPUREflagsre.S | re.M

re.SMake . match any character, including newlines

如果你的錨定的比賽,你想re.M使^$比賽線路與re.S