正则表达式不会捕获动态组

时间:2019-02-13 14:08:29

标签: regex

我有以下字符串:

// the length's not fixed. User could append more piped funtions.
{{ some:name | fn:some-function('ay') | fn:default(some:name) | some:other }}

目标是获得一个数组:

array[0] // some:name
array[1] // fn:some-function('ay')
array[2] // fn:default(some:name)
array[4] // some:other
// and so on

这是我到目前为止所拥有的:

^\{{2}(?:([^\|]+)\s\|)*(\s*[^\|^\}]+)\}{2}$

// it spits out:
// full match: {{ thing:name | fn:substring-before(':') | fn:default(thing:name) | some:other }}
// group 1: fn:default(thing:name)
// group 2: some:other

1 个答案:

答案 0 :(得分:1)

您的正则表达式不起作用,因为如果用*+量化组,则仅将最后一个重复项放入该组。所有其他的都将被丢弃。

找到多个匹配项,而不是查找一个完整的匹配项,每个匹配项都是数组的元素。

例如,您可以使用

(?:{{|\|)\s*([^|{}]+?)(?=\s*?(?:\||}}))

并获得每个比赛的第1组。

说明:

  • 比赛将以{{|(?:{{|\|))开头
  • 将您要的内容匹配到第1组(([^|{}]+?)
  • 请放心使用|}}(?=\s*?(?:\||}}))