2008-12-07 19 views
2

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

//@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的文件中的行。

任何想法?

回答

6

基本上你的正则表达式是贪婪的。这意味着通配符运算符会尽可能多地捕获您所看到的结果。在适当的地方将它改为非贪婪。在你的情况下使用:

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

+0

这个伎俩! 非常感谢。 – bishboria 2008-12-07 23:01:02

0

什么语言? python正则表达式(我猜他们是==到perl5正则表达式)有'贪婪'和'非贪婪'正则表达式的概念,你可以通过某处的标志来控制它。

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

非贪婪量词具有相同的 语法规则贪心的孩子,除了 与量词后跟一个 问号。例如, 非贪婪模式可能看起来像: “/ A [A-Z] *?B /”。在英文中,这意味着 “匹配A,然后只有大写字母,因此需要找到 B.

+0

另外,这个人是你的朋友:http://www.regexbuddy.com/ – 2008-12-07 22:57:48

1

你不应该也可以使用这个(.|\s),但是以正确方式进行操作的语法取决于您使用的语言或工具。在Perl或JavaScript,你可以这样做:

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

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