4

问题是我想匹配评论两侧的所有文本并排除评论本身。

有很多与“评论”相关的正则表达式帖子,但大多数都是其他语言的(我使用的是记事本++,维基百科告诉我是 POSIX ERE,我们不讨论语言或工具),而且大多数人都专注于寻找评论,我有完成了。

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

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

上面找到了“规则”和“结束”之间的任何内容,包括在内。美好的。

这将找到块注释:

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

上面找到了 和 之间的任何东西/**/包括在内。美好的。我不担心*/评论中是否有其中一个,在我的情况下不是问题。

RULE现在的问题是我如何在上面的正规则匹配中间将块注释放入负数,以便它匹配END除注释文本之外的所有内容?

如果您的答案也排除单行//注释,则加分。

4

2 回答 2

1

让我首先说:正则表达式不是为此而生的!

但这并非不可能:可以使用递归正则表达式来完成:

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

当然只捕捉“一切”

翻译为:

^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 次递归。

于 2013-01-24T22:07:59.867 回答
0

如果您能够翻转您的要求,而是从源中删除所有评论,您可以使用此模式来匹配评论(块和行):

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s
于 2013-03-06T15:35:00.267 回答