【问题标题】:TextMate match a block of codeTextMate 匹配一段代码
【发布时间】:2016-08-02 13:21:56
【问题描述】:

伙计们。 我正在研究 Atom 文本编辑器的语法主题。我需要匹配一段代码。
例如,

对于{ // 一些代码 }

I can do this by using
"begin": "(for){"
"end": "}"
"patterns": [//some patterns]

问题是在这个 for 循环中我可以有另一个代码块(例如 if {})并且“if”中的括号将匹配为“for”块的结尾。
有什么解决方法吗?因为我只需要在这个块内使用特定的模式。

【问题讨论】:

标签: regex textmate atom-editor


【解决方案1】:

有一些解决方法:

假设 for 循环内没有嵌套块,您可以使用以下模式(我对您正在使用的正则表达式引擎一无所知,但该模式应该适用于大多数情况):

'\{[^{}]*)([^{}]{[^{}]*})*?[^{}]*YOURPATTERNS([^{}]{[^{}]*})*+[^{}]*+\}'

让我们打开它:
它以左括号开始,并以尽可能多的非括号字符继续。然后,可以根据需要添加尽可能多的左括号 + 东西 + 右括号对。之后,您想要在循环中匹配的模式就会出现。然后是其余可能的开括号和右括号对。然后其余的非括号字符将封闭到右括号的间隙。

嵌套括号
由于您需要嵌套括号,因此您必须使用支持递归模式的非常强大的正则表达式引擎。我已经使用 python 的 regex 模块(不是 re 模块)为这种情况编写了一些东西。以下工作在那里,如果您使用另一个具有递归的引擎,则必须对其进行调整,否则就可以了。

r'\{(?P<any>[^{}]*)(?P<pairs>(?P<posany>[^{}]*+)\{(?&pairs)*?(?&posany)\})*?(?&any)YOURPATTERNS(?&pairs)*+(?&posany)\}'

【讨论】:

  • 不幸的是,我有嵌套块,这是个问题
  • 嵌套在 for 循环内?
  • 是的,例如,我可以有另一个 for 循环或 if 语句
  • 另一个 for 循环会很好,但是在第二个 for 循环中的另一个 for 循环会造成麻烦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多