PCRE正则表达式:只有一个匹配

时间:2016-08-19 08:42:47

标签: regex pcre

我想捕获响应主题字符串中的模式的字符串。

模式示例:## name ##,## address ##,## bankAccount ##,...

主题示例:

这是带有模式的模板:## name ##

您的银行帐户是:## bankAccount ##

您的地址是:##地址##

使用以下正则表达式:.*(#{2}[a-zA-Z]*#{2}).*,只匹配最后一个模式。

如何捕捉所有模式,而不仅仅是最后一个或第一个?

2 个答案:

答案 0 :(得分:1)

现在我已正确格式化你的正则表达式了,问题就出现了。你的正则表达式中的*被隐藏了,因为markdown用它来使文​​本变为斜体。

您的开场.*尽可能地贪婪地匹配,只备份足以让(#{2}[a-zA-Z]*#{2})匹配。这匹配在行中找到的最后一个模式,它之前的所有模式都与.*匹配。

答案 1 :(得分:0)

您需要删除我在评论中提到的.*,并使用preg_match_all

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

请参阅PHP demo

.*#{2}[a-zA-Z]*#{2}.*首先匹配0或更多字符而不是换行符,抓取整个,然后回溯到最后一次出现的#{2}[a-zA-Z]*#{2}模式,并且最后.*只占用行的其余部分。删除.*并使用preg_match_all,可以提取与#{2}[a-zA-Z]*#{2}模式匹配的所有子字符串。