Php preg_match_all 只匹配最后一个元素

Php preg_match_all matches only last element

我有这个正则表达式

{{([ 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] }}

正在捕获 word with spaces,以及 sub1sub 2Sub-3

正则表达式有效,但 sub-s 字符串匹配仅给出最后一个匹配项,即 Sub-3。 如何获取全部sub1sub 2Sub-3? 谢谢

要在多次组 2 中获取 sub 的值,您可以使用 \G 断言上一场比赛结束时的位置:

(?:{{([\w-]+(?: [\w-]+)*)|\G(?!$))(?:\h+\[([^]]+)\])?(?=.*})

Regex demo

这是另一个使用 \G 的变体,它速度更快并且避免了空匹配:

(?:{{([\w-]+(?:\h+[\w-]+)*)|(?!\A)\G)(?:\h*\[([^]]+)]|\h*}})

RegEx Demo

\G 断言位置在上一个匹配的末尾或第一个匹配的字符串的开头。