如何用正则表达式获得表达式的子组?

时间:2014-08-05 20:30:32

标签: javascript regex

我有这个模板(胡子一样):

{{varone}}

{{vartwo}}

{{#varthree}}
  {{subvarone}}
  {{subvartwo}}
{{/varthree}}

{{#varfour}}
  {{subvarthree}}
  {{subvarfour}}
{{/varfour}}

{{^varfive}}
  some message
{{/varfive}}

{{age}}

{{var_a}} {{#var_b}} {{var_c}} {{/var_b}}

我希望获得varone,vartwo,varthree,varfour,varfive和varsix,但不能获得块内的subvars。我有一个regexp来获取子组,但它运行不正常,我试图得到每个没有破折号的表达式,但它算法得到了subvars ......

更新:它也应该在单行中工作,所以它应该得到var_a,var_b而不是var_c ......

的javascript:     //模板上面有descibed模板。     console.log("模板>>",模板);

matches = template.match(/{{\s*\#\w+\s*}}[^#]*{{\s*\/\w+\s*}}/g) || [];
console.log("MATCHES groups >> ", matches);

matches = template.match(/{{\s*[\w\.\^]+\s*}}/g) || [];
console.log("MATCHES all >> ", matches);

请注意,在javascript中我们需要一个技巧来使点匹配也是分隔线,通过[\ s \ S],在这种情况下我决定包括除了破折号之外的所有东西来收集子表达式。 这是控制台结果:

MATCHES groups >>  [ '{{#varthree}}\n  {{subvarone}}\n  {{subvartwo}}\n{{/varthree}}',
  '{{#varfour}}\n  {{subvarthree}}\n  {{subvarfour}}\n{{/varfour}}\n\n{{^varfive}}\n  some message\n{{/varfive}}' ]
MATCHES all >>  [ '{{varone}}',
  '{{vartwo}}',
  '{{subvarone}}',
  '{{subvartwo}}',
  '{{subvarthree}}',
  '{{subvarfour}}',
  '{{^varfive}}',
  '{{age}}' ]

1 个答案:

答案 0 :(得分:1)

  

我想获得varone,vartwo,varthree,varfour,varfive和varsix,但不能获得块内的subvars。

从索引1获取匹配的组。

(?:\n|^){{([^}]*)}}

这是DEMO

模式说明:

  (?:                      group, but do not capture:
    \n                       '\n' (newline)
   |                        OR
    ^                        the beginning of the string
  )                        end of grouping
  {{                       '{{'
  (                        group and capture to \1:
    [^}]*                    any character except: '}' (0 or more times)
  )                        end of \1
  }}                       '}}'

您也可以尝试 Lazy 模式。

(?:\n|^){{(.*?)}}