【问题标题】:Regular Expression to remove annotation code [duplicate]正则表达式删除注释代码[重复]
【发布时间】:2019-12-17 05:19:10
【问题描述】:

我是正则表达式的新手。

我尝试删除项目中未使用的代码,例如

/*
    // random unmanaged annotation
    foo = var;
    doSomething();
    multilineFunction(a,
                      b);
*/

并留下“非代码”注释

/*
     real annotation
*/

我尝试查找并替换为“/* 和 */ 之间的内部包含行 endwith ;”的正则表达式但它不适用于我的正则表达式。如何制作那个正则表达式?

我在 (/\*)(.*\n)*?(.*\*/) 的 /* */ 内部进行了尝试,并且 包含行以 ; (/\*)(.*\n)*?(.*;\n)(.*\n)(.*\*/) 结尾,但是这个正则表达式找到了 */ 的最后一个匹配项,并且可能是脏的。

编辑:我只想将其作为 IDE 中的替换功能。我现在通过写python代码解决了,但我还是很好奇。

【问题讨论】:

  • 如何区分“代码”和“非代码”?
  • @Sweeper 如果注释中没有分号,我认为这不是代码注释。
  • Regex 从根本上来说是错误的工具。以下是关于 HTML,但基本推理对于任何上下文无关语言都是相同的:stackoverflow.com/questions/590747/…
  • @tripleee 这很好,但不能过滤包含分号。
  • 我会改用github.com/eliben/pycparser 之类的东西。

标签: regex


【解决方案1】:

正如 cmets 中已经解释的那样,最好使用好的解析器。

对于一次性破解,您可以使用以下正则表达式:

\/\*[^;]*;.*?\*\/

测试here

假设它可以正常工作: - 代码是正确的 C 并且它包含分号 ; - 注释不包含分号;

如果假设没有得到满足,您需要做一些额外的修改,或者使用适当的解析器,如最初所述。

【讨论】:

  • 这不适用于我的 IDE(Rider),但可以在测试中找到。
【解决方案2】:

你可以使用\/\*\s+(\/\/.+)[\s\S]+\*\/

解释:

\/\* - 匹配 \* 字面意思

\s+ - 匹配一个或多个空格(包括换行符)

(\/\/.+) - 匹配以\\ 开头的行,即注释(但只有一行)并将其存储在第一个捕获组中

[\s\S]+ - 匹配一个或多个任意字符(\s 是空格,\S 是非空格

\*\/ - 匹配 *\ 字面意思

Demo

然后用第一个捕获组替换它。

请注意,如果有注释块,它仅适用于放置在开头的一个 ilne cmets

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 2018-03-31
    • 2017-07-26
    • 2019-08-28
    • 2011-07-11
    • 2011-01-28
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多