在可能嵌套的花括号之间提取代码

时间:2018-05-02 14:29:54

标签: regex

我一直试图在两个大括号之间提取任何文本,但事实是这个文本可能包含其他花括号。

我一直在尝试的正则表达式(见下文)不起作用,因为它不会停止到结束的大括号。

实际正则表达式

/class\s+([A-Z]{1}[a-zA-Z0-9]+)\s+(?:<\s+([a-zA-Z0-9]+))?\s*{(.|\n|\r)*}/gm

根据下面的示例,它与第三组

的其余文本相匹配

样品

class Main < Console {
  + main:Int () {
    !String hello = "Hello, World!";
    this.out(hello);
    >> 0;
  }

}

class Foobar {
  + foobar:None () {
    #Some code...
  }
}

匹配

Group 1: Main
Group 2: Console
Group 3:

有没有人知道如何实现这一目标(如果仅使用Regex就可以实现)?

1 个答案:

答案 0 :(得分:0)

试试这个:

/class\s+([A-Z]{1}[a-zA-Z0-9]+)\s+(?:<\s+([a-zA-Z0-9]+))?\s*{[\s\S]*?\n}/gm

regex101 demo

这是完全相同的,除了最后一位,而不是{(.|\n|\r)*},我改为{[\s\S]*?\n}。让我们稍微分解一下:

  • [\s\S]*?字面上匹配所有内容,但是懒惰,所以它不会跳过匹配之间的括号。
  • \n}仅匹配前面没有空格的右括号,因此它与中间右括号不匹配。

希望这有助于:)