2016-08-19 2 views
-1

Я хочу поймать строки, которые отвечают шаблону в строке темы.PCRE Регулярное выражение: только одно совпадение

Patterns примеры: ## Название ##, ## адрес ##, ## ВагЛАссоипЬ ## ...

Subject пример:

Это шаблон с шаблонами: ## Название ##

Ваш банковский счет: ## ВагЛАссоипЬ ##

Ваш   адрес: ## адрес ##

 

Со следующим регулярным выражением: .*(#{2}[a-zA-Z]*#{2}).*, только последний рисунок подобран.

Как захватить все шаблоны, а не только последние или первые?

+1

Удалить '. *' S: '# {2} [a-zA-Z] * # {2}' –

+0

Спасибо за ваш ответ, но если я удалю эту часть, будет сопоставлен только первый шаблон – MoOwgly

+0

Все это зависит от того, какой язык вы используете и какие методы вы выбираете. Вышеупомянутый шаблон будет соответствовать любой подстроке внутри большей подстроки столько раз, сколько вам нужно, если вы используете соответствующие методы. –

ответ

0

Вы должны удалить .*, как я уже упоминал в своем комментарии, и использовать preg_match_all:

$re = '~#{2}[a-zA-Z]*#{2}~'; 
preg_match_all($re, "##name##, ##address##, ##bankAccount##", $m); 
print_r($m); 

Посмотреть PHP demo

The .*#{2}[a-zA-Z]*#{2}.* совпавшие 0 или более, кроме символа новой строки символов в первом, захватывая целых линии, а затем отступали до последнего появления #{2}[a-zA-Z]*#{2} рисунка, а последние .* только хватали остальную часть линии. Извлекая .* и используя preg_match_all, все подстроки, соответствующие шаблону #{2}[a-zA-Z]*#{2}, могут быть извлечены.

1

Теперь, когда я правильно отформатировал ваше регулярное выражение, проблема показывается. A * в вашем регулярном выражении было скрыто, так как markdown взял его, чтобы сделать текст курсивом.


Ваши открытия .* матчи жадностью столько, сколько он может, только резервное копирование достаточно, чтобы позволить (#{2}[a-zA-Z]*#{2}) матч. Это соответствует последнему шаблону, найденному в строке, все до того, как он был сопоставлен .*.

+0

Хорошо, я не знаю, для уценки, извините. – MoOwgly