TextMate匹配一段代码

时间:2016-08-02 13:21:56

标签: regex textmate atom-editor

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

  

for {       //一些代码   }

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

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

1 个答案:

答案 0 :(得分:1)

有一些解决方法:

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

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

让我们打开它:
   它以一个左括号开头,并继续尽可能多的非括号字符。然后,根据需要可以跟随许多开口支架+东西+闭合支架对。之后,您想要在循环中匹配的模式可以到来。然后是其余可能的开启和关闭括号对。然后剩下的非括号字符会将间隙括在右括号中。

嵌套括号
由于您需要嵌套括号,因此必须使用支持递归模式的非常强大的正则表达式引擎。我已经使用python的regex模块(而不是re模块)为该案例编写了一些内容。以下是在那里工作,如果你使用另一个带递归的引擎,你将不得不调整它,否则就可以了。

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