我正在尝试检索两个不同分隔符之间存在的数据,
这种模式可能多次出现,这是我到目前为止的正则表达式
/\@\((\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。
总是一件小事。
答案 0 :(得分:1)
只需在每个?
之后添加*
即可使用非贪婪的匹配:
/\@\((\w*?)\)\{\{\{([^]*?)\}\}\};/
答案 1 :(得分:1)
您可以在?
之后添加*
并使用修饰符g
使其全局化,从而使其变得非贪婪:
/\@\((\w*)\)\{\{\{([^]*?)\}\}\};/g
如您所见,它分别与以下部分匹配:
@(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。