多次匹配代码块的正则表达式

5

我想在文件中多次匹配一段代码块,但是无法想出正则表达式来实现。代码块的示例如下:

//@debug
...
// code in here
...
//@end-debug (possibly more comments here on same line)

我将尝试匹配的每个代码块都以//@debug开头,并在包含//@end-debug的行的末尾停止。

目前我的代码如下:

/(\/{2}\@debug)(.|\s)*(\/{2}\@end-debug).*/

但是这与第一个//@debug一直匹配到文件中最后一个//@end-debug所在行的大块相匹配。

有什么想法吗?

3个回答

7

基本上,您的正则表达式是贪婪的。这意味着通配符运算符尽可能地获取结果。只需在适当的情况下将其更改为非贪婪即可。在您的情况下,请使用:

/(/{2}\@debug)(.|\s)*?(/{2}\@end-debug).*/


1
如果您对代码块进行缩进以进行突出显示,我会投赞成票。 - Brad Gilbert

1

你不应该使用那个(.|\s)的hack,但是正确的方法取决于你使用的语言或工具的语法。在Perl或Javascript中,你可以这样做:

/\/\/@debug.*?^\/\/@end-debug[^\r\n]*/sg

/s 修饰符允许点匹配回车和换行符,从而使正则表达式更易于阅读和更高效。这也意味着我必须将第二个 .* 更改为 [^\r\n]*,但这是值得的。 /g 修饰符是让正则表达式多次匹配(即“全局”)的关键。


0

什么语言?Python正则表达式(我猜它们与perl5 regexps相同)有“贪婪”和“非贪婪”正则表达式的概念,可以通过某个标志来控制。

这个页面上搜索“贪婪vs非贪婪”,也许这个页面更好。

非贪婪量词与常规贪婪量词具有相同的语法,只是在量词后面加上一个问号。例如,非贪婪模式可能看起来像:“/ A [A-Z] *? B /”。用英语表示,意思是“匹配一个A,然后只匹配尽可能少的大写字母,直到找到B为止。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接