2016-12-07 9 views
2

Matching последнее вхождение шаблона с помощью регулярного выраженияшаблон согласования в тексте с использованием регулярных выражений

На следующий текст:

commit 5a254a0bfc0232bd838157cada953f87a7b6ffad 
Merge: 2b9fcd8 a9b214e 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 11:54:08 2016 -0500 

    Merge branch 'master' of github.com:peterpan/testing 

commit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 11:53:51 2016 -0500 

    KWP245 

commit a9b214eb476e3d1f3896db31125d6e8108dca06d 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:40 2016 -0600 

    QZN0O5 

commit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:38 2016 -0600 

    QZN0O5 

[EDIT 1]

Следующая текст более общий, я думаю:

commit 5a254a0bfc0232bd838157cada953f87a7b6ffad 
Merge: 2b9fcd8 a9b214e 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 11:54:08 2016 -0500 

    Merge branch 'master' of github.com:peterpan/testing 

commit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 11:53:51 2016 -0500 

    KWP245 

commit a9b214eb476e3d1f3896db31125d6e8108dca06d 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:40 2016 -0600 

    QZN0O5 

commit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:38 2016 -0600 

    QZN0O5 

commit bb2762bd17d3d6b1fdfe0711fe8e41a28b092212 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:38 2016 -0600 

    H82LKJ 

commit aa72dfeb476e3d1f3896db31125d6e8108dca06d 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:40 2016 -0600 

Я хочу записать последний блок текста с «QZN0O5» из слова коммита.

commit a9b214eb476e3d1f3896db31125d6e8108dca06d 
Author: Peter Pan <[email protected]> 
Date: Wed Dec 7 10:52:40 2016 -0600 

    QZN0O5 

Я имею в виду первый совершить с текстом QZN0O5.

Я пробовал:

preg_match("/(?<!commit).*?QZN0O5/is", $text, $matches); 

, но не успех.

На самом деле я хочу зафиксировать код фиксации: a9b214eb476e3d1f3896db31125d6e8108dca06d, а точнее. Если у вас есть решение для этого, лучше.

Любая идея о том, как согласовать этот текст?

+0

Match все из них и получить последний элемент в массиве. –

+0

Я получаю только один большой кусок матчей вместо нескольких небольших совпадений. – Angel

ответ

1

Вы можете использовать следующее регулярное выражение с preg_match_all и получить последний пункт:

/^\s*QZN0O5\s*(.*\R.*\R.*+)(?!(?s:.*^\s*QZN0O5))/m 

Или - в качестве альтернативы:

/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m 

ВИДЕТЬ regex demo и regex demo 2.

Детали:

  • ^ - линия начать
  • \s* - 0 или более пробельные
  • QZN0O5 - код, который вы должны найти
  • \s* - 0+ пробельные символы
  • (.*\R.*\R.*+) - 3 линии ...
  • (?!(?s:.*^\s*QZN0O5)) - но не последовало каких-либо 0+ символов (рядный модификатор группы (?s:....) делает . перерывы матч линии тоже), а затем с начала строки, 0+ пробельные и код, который вы должны соответствовать)
  • $ - конец line

Второе регулярное выражение аналогично, но часть (.*+(?:\R(?!\R).*)*+) просто делает регулярное выражение до двухстрочного разрыва.

Смотрите PHP demo:

$re = '/^\h*QZN0O5\s*(.*+(?:\R(?!\R).*)*+)(?![\s\S]*?^\h*QZN0O5$)/m'; 
$str = "commit 5a254a0bfc0232bd838157cada953f87a7b6ffad\r\nMerge: 2b9fcd8 a9b214e\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 11:54:08 2016 -0500\r\n\r\n Merge branch 'master' of github.com:peterpan/testing\r\n\r\ncommit 2b9fcd8c10ee18ad2ea88190a3b10cc8affd4093\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 11:53:51 2016 -0500\r\n\r\n KWP245\r\n\r\ncommit a9b214eb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 10:52:40 2016 -0600\r\n\r\n QZN0O5\r\n\r\ncommit a6be0abd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 10:52:38 2016 -0600\r\n\r\n QZN0O5\r\n\r\ncommit bb2762bd17d3d6b1fdfe0711fe8e41a28b092212\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 10:52:38 2016 -0600\r\n\r\n H82LKJ\r\n\r\ncommit aa72dfeb476e3d1f3896db31125d6e8108dca06d\r\nAuthor: Peter Pan <[email protected]>\r\nDate: Wed Dec 7 10:52:40 2016 -0600"; 
preg_match_all($re, $str, $matches); 
echo end($matches[1]); 
+0

Я сделал попытку с другим текстом образца, и это не сработало. Я опубликовал другой текст ниже предыдущего. – Angel