我有这个正则表达式
{{([ 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
和sub1
,sub 2
,Sub-3
。
正则表达式正在运行,但是sub-s字符串匹配的仅给出最后一个匹配,即Sub-3
。
如何获取所有sub1
,sub 2
,Sub-3
?
谢谢
答案 0 :(得分:3)
这是使用\G
的另一种变体,它变快了一点并且避免了空匹配:
(?:{{([\w-]+(?:\h+[\w-]+)*)|(?!\A)\G)(?:\h*\[([^]]+)]|\h*}})
\G
在上一场比赛的末尾或首场比赛的字符串开头声明位置。
答案 1 :(得分:2)
要获取多倍时间组2中的sub值,您可以使用\G
在上一场比赛的末尾断言位置:
(?:{{([\w-]+(?: [\w-]+)*)|\G(?!$))(?:\h+\[([^]]+)\])?(?=.*})