js两组分隔符之间的正则表达式匹配,可能会多次出现

时间:2015-05-31 07:02:31

标签: javascript regex

我正在尝试检索两个不同分隔符之间存在的数据,

这种模式可能多次出现,这是我到目前为止的正则表达式

/\@\((\w*)\)\{\{\{([^]*)\}\}\};/

这适用于单个匹配,并且如果在分隔符集之间存在其他数据,则它也将正确匹配整个集合,但通常不是这种情况  但在大多数情况下,它会匹配

例如

@(name){{{
contains a bunch of arbitrary text to save for later
when @name occurs again, it will be replaced with this.
}}};
@name
@(broken){{{
  this is a broken match
}}};

将正常捕捉模式

contains a bunch of arbitrary text to save for later
when @name occurs again, it will be replaced with this.
}}};
@name
@(broken){{{
  this is a broken match

我知道有些地方我需要非贪婪的评价,但我不确定在哪里。

我还有一个意图,即最终需要采用这种模式并进行嵌套,从而产生如下结构:

@(name){{{
  @(anotherName){{{
    contains a bunch of arbitrary text to save for later
    when @name occurs again, it will be replaced with this.
  }}}
  @anotherName;
}}};
@name
@(broken){{{
  this is a broken match
}}};

尽管如此,我几乎可以肯定我不能单独使用正则表达式,并且递归超出了我的问题的范围,但我想证明它是错误的。

编辑:

我之前尝试过给定的模式但无济于事,但是接受的答案及其提供的示例向我证明它不是正则表达式问题,而是程序自身的问题。

我正在循环替换,因为一个替换可能会添加要替换的字符串的新实例,并且需要额外的扩展。我将测试值设置为true,这将使循环重新开始,并且永远不会将其设置为false。

总是一件小事。

2 个答案:

答案 0 :(得分:1)

只需在每个?之后添加*即可使用非贪婪的匹配:

/\@\((\w*?)\)\{\{\{([^]*?)\}\}\};/

答案 1 :(得分:1)

您可以在?之后添加*并使用修饰符g使其全局化,从而使其变得非贪婪:

/\@\((\w*)\)\{\{\{([^]*?)\}\}\};/g

see the DEMO

如您所见,它分别与以下部分匹配:

@(name){{{
  @(anotherName){{{
    contains a bunch of arbitrary text to save for later
    when @name occurs again, it will be replaced with this.
  }}}
  @anotherName;
}}};

@(broken){{{
  this is a broken match
}}};

它与嵌套模式不匹配。因为大多数正则表达式引擎都不支持嵌套匹配,因为在这种情况下你会落入Context Free Grammers而它反对常规语言

因此,作为此类任务的正确方法,您可以使用适当的Parser。