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

时间:2008-12-07 22:50:50

标签: regex

我想在文件中匹配多次次的代码块,但无法使用正则表达式来执行此操作。代码块的一个例子是:

//@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 个答案:

答案 0 :(得分:6)

基本上你的正则表达式是贪婪的。这意味着通配符操作符可以根据您看到的结果尽可能多地获取。只要在适当的时候将其改为非贪婪。在您的情况下使用:

/(/ {2} \ @调试)(| \ S)?*(/ {2} \ @端调试)* /

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

什么语言? python正则表达式(我猜他们= = perl5 regexps)有'贪婪'与'非贪婪'正则表达式的概念,你可以通过某个地方的旗帜控制它。

this page上搜索“贪婪与非贪婪”,this page可能会更好

  

非贪婪量词具有相同的含义   语法为常规贪婪的,除了   用量词后跟a   问号。例如,a   非贪婪的模式可能如下所示:   “/ A [A-Z] *?B /”。在英语中,这意味着   “匹配一个A,然后只匹配一个   需要大写字母才能找到   a B。“