正则表达式匹配所有排除块注释

时间:2013-01-16 16:40:59

标签: regex comments notepad++

问题是我希望匹配评论任何一方的所有文本并排除评论本身。

有很多'评论'相关的正则表达式帖子,但大多数都是其他语言(我使用的是维基百科告诉我的是notixad ++是POSIX ERE,我们不讨论语言或工具),大多数都专注于查找评论,我已经做过了。

这将找到我想要的包含文本(这将包括匹配中的内部块注释):

(^)rule ((.|\n|\r)*?)(^)end

以上在“规则”和“结束”之间找到任何内容,包括在内。细

这将找到块注释:

(?:/\*(?:(?:[^*]|\*(?!/))*)\*/)

以上内容可找到/**/之间的任何内容。精细。我不担心评论中是否有*/,而不是我的问题。

现在的问题是如何在上面的正规则匹配中间将块注释放入否定值,以便它匹配RULEEND之间的所有内容,除了注释文本?< / p>

如果您的答案也排除了单行//评论,则会获得奖励积分。

2 个答案:

答案 0 :(得分:1)

首先让我说:正则表达不是这样做的!

但这并非不可能:它可以通过递归正则表达式完成:

  • 匹配从“规则”到“结束”OR的所有内容或者注释块的开头,在进一步匹配所有内容之后“结束”或注释块的开头,在进一步匹配所有内容之后“结束”或等.. ..

当然只捕获'everythings'

转换为:

^rule((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/)))
                                                                  ^
                                                             put cursor there
                                                              and insert
                           ((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/)))
                                                                or end with
                           (?:\r?\n^end)

然后用

替换

$ 1 $ 2 $ 3 $ 4 $ ..

其中替换次数应与递归次数匹配

测试Notepad ++的限制我创建了这个小提琴:

http://jsfiddle.net/lovinglobo/wPKjb/

Notepad ++通过简单地说“无效的正则表达式”来打破29次以上的递归。

答案 1 :(得分:0)

如果您能够翻转您的要求并删除源中的所有注释,则可以使用此模式匹配注释(块和行):

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s