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

PCRE Regular expression : only one matching

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

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

主题示例:

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

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

您的地址是:##address##

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

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

既然我已经正确格式化了你的正则表达式,问题就出现了。正则表达式中的 * 被隐藏,因为 Markdown 将其设为斜体。


你的开局 .* 尽可能多地匹配,只备份足够让 (#{2}[a-zA-Z]*#{2}) 匹配。这匹配行中找到的最后一个模式,它之前的所有内容都已被 .*.

匹配

您需要删除我在评论中提到的 .*,并使用 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} 模式的子字符串。