PHP preg_match_all仅匹配最后一个元素

3

我有这个正则表达式

{{([ a-zA-Z0-9_\-]+)\s*(?:\[([ a-zA-Z0-9_\-]+)\]\s*)*}}

我需要匹配类似以下的字符串:

{{word with spaces}}
{{word with spaces [sub1]}}
{{word with spaces   [sub1]  [sub 2]  [Sub-3] }}

捕获 带有空格的单词, 和 sub1, sub 2, Sub-3

正则表达式有效,但是对于子字符串匹配仅返回最后一个匹配项,即Sub-3。 如何获取所有的sub1, sub 2, Sub-3? 谢谢


你在第二行是否漏掉了 } 符号? - anubhava
2个回答

4
这是另一种使用\G的变体,速度更快且避免了空匹配:
(?:{{([\w-]+(?:\h+[\w-]+)*)|(?!\A)\G)(?:\h*\[([^]]+)]|\h*}})

正则表达式演示

\G 断言为前一个匹配的结束位置,或第一次匹配时字符串的开始位置。


2
在多次匹配第2组中获取 sub 的值,您可以使用 \G 断言前一个匹配的末尾位置:
(?:{{([\w-]+(?: [\w-]+)*)|\G(?!$))(?:\h+\[([^]]+)\])?(?=.*})

正则表达式演示


谢谢,我知道\G,但有点难用;)正则表达式可以工作,但是它返回了许多空匹配:有没有办法避免这些? - ʞᴉɯ
@ʞᴉɯ 是的,你可以这样做。anubhava发布了一个版本,其中包含一个替换方案,可以匹配\h*\[([^]]+)]\h*}},从而解决这个问题。 - The fourth bird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接