【问题标题】:Regex to match all excluding block comments正则表达式匹配所有排除块注释
【发布时间】:2012-12-31 01:27:33
【问题描述】:

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

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

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

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

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

这将找到块注释:

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

上面找到介于/**/ 之间的任何内容,包括两者。美好的。我不担心评论中是否有 */ 之一,这对我来说不是问题。

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

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

【问题讨论】:

  • 你想做什么?是否可以只使用您的块评论匹配模式然后删除匹配项?
  • 实际上,最新版本的 notepad++ 使用了 Phillip Hazel 强大而健壮的 PCRE regex library,它提供了先进的 Perl 5 正则表达式结构。 Wiki 中的信息可能有点陈旧。关于您手头的问题 - 这可能无法使用单个正则表达式完成(取决于您正在编辑的源代码语言)。
  • 在发布之前,我的想法是使用正面评论匹配并消除 cmets,这是我们将要做的,因为我们的样本集足够小。我发现类似的帖子也说这种情况正在突破正则表达式可以做的限制。感谢您的回复。干杯!
  • 我不熟悉notepad++,但如果@ridgerunner 是正确的并且您可以使用PCRE 库,那么您可以使用单个正则表达式来执行此操作。我自己最近在这里用递归模式回答了 2 个问题,都使用了内部的环视规则。

标签: regex comments notepad++


【解决方案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 次递归。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 2012-10-26
      • 2012-10-18
      • 2011-10-29
      • 2010-11-14
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多