2013-06-12 2 views
2

Мне нужно регулярное выражение, которое соответствует шаблону, который распространяется по нескольким строкам. Например, мне нужно взять первое git-сообщение определенного автора.Regexp: соответствие шаблону нескольких строк

Я знаю, что есть способ сделать это с помощью git, но я хочу его в regexp.

commit 9a06fd844952587774632f470442288e422910da 
Author: Mark Gitter <[email protected]> 
Date: Tue Jun 11 17:13:26 2013 +0300 

    Random git comment. 

Это регулярное выражение соответствует commit [a-z0-9]* коммита SHA-1, но я не могу заставить его начать поиск на следующей строке. Я тестирую его в http://gskinner.com/RegExr/

Я хочу, чтобы соответствовать

commit 9a06fd844952587774632f470442288e422910da 
Author: Mark Gitter 

Любые идеи?

+0

Я попытался добраться до следующей строки. Например, я ожидал бы 'commit [a-z0-9] * \ nAuthor' для соответствия' commit 9a06fd844952587774632f470442288e422910da Автор, но это не так. Что я делаю не так? –

+1

Вы находитесь в Windows. Похоже, он содержит '\ r'. Используйте '\ s +', чтобы сделать его более надежным. 'commit ([a-z0-9] {40}) \ s + Author' – Prinzhorn

ответ

1

Использование \r\n для новой линии:

commit (.*)\r\nAuthor:(\s*\w+\s*\w+) 
+0

Да, проблема была в возврате строки. Я нашел 'commit (. *) [(\ R) | (\ n) | (\ r \ n)] Автор: (\ s * \ w +)', чтобы быть довольно перекрестной платформой ... –

+0

Для меня это только захватили имя автора. –

+0

Он будет записывать только первое имя, моя основная цель состояла в том, чтобы показать, как обрабатывать новый символ линии. Однако я обновляю ответ, чтобы записать все имя. –

2

Поскольку некоторые имена автора содержит пробела, мы можем захватить все до < знака, не включая предшествующее пространства.

commit ([a-z0-9]*)\s*Author:(\s*[^<]+)(?<!\s) 

Вот proof of concept.

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