正则表达式模式匹配固定深度的嵌套内容

时间:2015-04-17 17:51:13

标签: regex nested

就这个答案显示(Can regular expressions be used to match nested patterns?)而言,我们无法创建可用于匹配无限嵌套模式的正则表达式。但是,我们可以创建一个匹配该模式的N个嵌套出现的正则表达式模式吗?

例如,我们如何创建一个匹配像这样的注释最多3层的正则表达式?

   <*
      Comment of depth 1 containing another comment
      <* 
         That is a comment of depth 2 containing another comment
         <*
            Nanananananana BATMAN!!!
         *>
      *> 
    *>

2 个答案:

答案 0 :(得分:0)

<\*[\s\S]*?<\*[\s\S]*?<\*[\s\S]*?\*>[\s\S]*?\*>[\s\S]*?\*>

一种简单的方法。参见演示。

https://regex101.com/r/sJ9gM7/129

您可以在此处使用recursive regex

<\*(?:(?R)|(?:(?!<\*|\*>)[\s\S])+)*\*>

参见演示。

https://regex101.com/r/sJ9gM7/131

答案 1 :(得分:0)

你在评论中说,你将把正则表达式整合到一个BNF定义中,这个定义将被送到图书馆&#34; mpc&#34;。

尝试定义这样的多行注释:

mlcomment    : "<*" (<mlcomment> | /\*[^>]|[^*]/)* "*>" ;

我用mpc试了一下它就可以了。

如果它们是嵌套的,您可以发表评论。例如:

<* A multiline comment here
<* Another one here *> *>

这样做的缺点是你不能在结束标签上有多个星号。这样:

<* A multiline comment
second line **>

无法运作。但我认为它与mpc的限制一样接近。