问题是我希望匹配评论任何一方的所有文本并排除评论本身。
有很多'评论'相关的正则表达式帖子,但大多数都是其他语言(我使用的是维基百科告诉我的是notixad ++是POSIX ERE,我们不讨论语言或工具),大多数都专注于查找评论,我已经做过了。
这将找到我想要的包含文本(这将包括匹配中的内部块注释):
(^)rule ((.|\n|\r)*?)(^)end
以上在“规则”和“结束”之间找到任何内容,包括在内。细
这将找到块注释:
(?:/\*(?:(?:[^*]|\*(?!/))*)\*/)
以上内容可找到/*
和*/
之间的任何内容。精细。我不担心评论中是否有*/
,而不是我的问题。
现在的问题是如何在上面的正规则匹配中间将块注释放入否定值,以便它匹配RULE
和END
之间的所有内容,除了注释文本?< / p>
如果您的答案也排除了单行//
评论,则会获得奖励积分。
答案 0 :(得分:1)
首先让我说:正则表达不是这样做的!
但这并非不可能:它可以通过递归正则表达式完成:
当然只捕获'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