【问题标题】:Extract code between curly braces that can possibly be nested提取可能嵌套的花括号之间的代码
【发布时间】:2018-10-12 17:05:44
【问题描述】:

我一直在尝试提取两个大括号之间的任何文本,但问题是该文本可能包含其他大括号。

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

实际的正则表达式

/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】:

试试这个:

/class\s+([A-Z]\w+)\s+(?:<\s+(\w+))?\s*{[\s\S]*?\n}/gm

regex101 demo

除了最后一点,我没有做{(.|\n|\r)*},而是用{[\s\S]*?\n}代替。让我们分解一下:

  • [\s\S]*? 几乎匹配所有内容,但是是惰性的,所以它不会跳过匹配之间的括号。
  • \n} 只匹配前面没有空格的右括号,所以它不匹配中间的右括号。

希望这有帮助:)

【讨论】:

  • 太棒了!也许a-zA-Z0-9 可以替换为\w,这样可以简化表达式并考虑包含下划线的标识符的情况。
  • @coterobarros 公平点,类名确实可以有下划线
猜你喜欢
  • 2019-02-07
  • 2013-04-21
  • 1970-01-01
  • 2021-10-13
  • 2021-05-25
  • 2013-06-27
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多