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);
.*#{2}[a-zA-Z]*#{2}.*
一开始匹配了除换行符以外的0个或多个字符,抓取整个行,然后回溯到最后出现#{2}[a-zA-Z]*#{2}
模式,最后 .*
只抓住了 行 的其余部分。删除 .*
并使用 preg_match_all
,可以提取所有匹配 #{2}[a-zA-Z]*#{2}
模式的子字符串。
我想捕获响应主题字符串中的模式的字符串。
模式示例:##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);
.*#{2}[a-zA-Z]*#{2}.*
一开始匹配了除换行符以外的0个或多个字符,抓取整个行,然后回溯到最后出现#{2}[a-zA-Z]*#{2}
模式,最后 .*
只抓住了 行 的其余部分。删除 .*
并使用 preg_match_all
,可以提取所有匹配 #{2}[a-zA-Z]*#{2}
模式的子字符串。