使用 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