PHP preg_match_all仅匹配最后一个元素

时间:2019-07-19 08:34:08

标签: php regex pcre

我有这个正则表达式

{{([ 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 spacessub1sub 2Sub-3

正则表达式正在运行,但是sub-s字符串匹配的仅给出最后一个匹配,即Sub-3。 如何获取所有sub1sub 2Sub-3? 谢谢

2 个答案:

答案 0 :(得分:3)

这是使用\G的另一种变体,它变快了一点并且避免了空匹配:

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

RegEx Demo

\G在上一场比赛的末尾或首场比赛的字符串开头声明位置。

答案 1 :(得分:2)

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

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

Regex demo