2015-05-02 2 views
0

Я пытаюсь получить выражение регулярного выражения для соответствия нескольким шаблонам с мультилиниями, но он поддерживает все. Например, я хочу, чтобы соответствовать два раза этот код:regex multiline, не работающий над повторяющимися шаблонами

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)*) соответствует всему. Я хочу, чтобы он остановился, когда обнаружил «ЧИСТЫЙ». Другими словами, правильное совпадение дало бы мне два совпадения кода выше, но вместо этого мое выражение останавливается только на последнем ключевом слове «PURE», делая только одно совпадение.

дайте мне знать, если вы видите, почему это не работает.

+0

Read «лени вместо алчности»: 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

haha, без проблем –

+0

Кстати, отметьте в качестве ответа, если решите свою проблему и ответьте на ответы, которые помогли вам –

0

Вместо (.|\n|\r)* используйте .*? (точка с нежирный модификатор ?) и добавьте флаги s и g, например:

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

s флаг означает, что . соответствует \r и \n, а g флаг позволяет захватывать все совпадающие строки в теме текста.

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(.*?)\bPURE с flagsre.S | re.M

re.S говорит, что Make . match any character, including newlines

Если вы якорь ваши матчи, вы хотите re.M так, что ^ и $ матча начало и конец строки с re.S

Смежные вопросы