使用 PHP,我试图让我的正则表达式匹配下面的两个模板引用。问题是,它还</ul>
从第一个文本块中获取。当我删除/s
它只捕获第二个引用的标志时。我做错了什么?
/{{\%USERS}}(.*)?{{\%\/USERS}}/s
这是我的字符串。
<ul class="users">
{{%USERS}}
<li>{%}</li>
{{%/USERS}}
</ul>
{{%USERS}} hello?!{{%/USERS}}
为什么我的表情捕捉太多或太少?
您可能需要使用非贪婪量词。
*
并且+
“贪婪”。它们会匹配尽可能多的字符。
*?
并且+?
是“非贪婪的”。它们将只匹配移动到正则表达式下一部分所需的字符数。
所以在下面的测试字符串中:
<alpha><bravo>
<.+>
将捕获<alpha><bravo>
(因为也.
匹配><
!)。<.+?>
将捕获<alpha>
.为什么我的表情捕捉太多或太少?
因为量词在默认情况下是贪婪的,所以它的捕获太多了(请参阅 Li-aung Yip 回答 +1)
如果您删除修饰符s
,它只匹配第二次出现,因为该修饰符.
也匹配换行符,所以没有它,就不可能匹配第一部分,因为中间有换行符。
查看非贪婪的答案
{{\%USERS}}(.*?){{\%\/USERS}}
在 Regexr 上,这是一个测试正则表达式的好地方。
顺便提一句。我在捕获组之后删除了?
它,它不需要,因为*
也匹配空字符串,所以不需要让它额外可选。
这是您的正则表达式:
/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g