如何从代码中删除C样式注释

How to remove C-style comments from code

本文关键字:样式 注释 删除 代码      更新时间:2024-01-23

我刚刚在SO上读到一个新问题,问的问题与我在标题中问的问题基本相同。这让我思考——并在网上搜索(当然,大多数点击都指向SO;)。所以我想-

应该有一个简单的正则表达式,能够从任何代码中删除C风格的注释

是的,这个问题/陈述在SO上有答案,但我发现的答案都不完整和/或过于复杂。

因此,我开始进行实验,并提出了一个适用于I可以想象的所有类型的代码的方法:

(?:'/'/(?:'''n|[^'n])*'n)|(?:'/'*(?:'n|'r|.)*?'*'/)|(("|')(?:''''|'''2|'''n|[^'2])*?'2)

第一个选项检查双斜杠//注释。第二个是普通的CCD_ 2。第三个问题是,我很难找到处理相同任务的其他正则表达式-字符串包含字符串之外的字符序列,将被视为注释

这部分所做的是捕获捕获组一中的任何字符串,将捕获组二中的引号与带引号的字符串相匹配,直到字符串的末尾。

捕获组1应保留在替换中,所有内容都被丢弃(为""替换),留下未注释的代码:)。

下面是regex101中的一个C示例。

好的。。。所以这不是一个问题。这是一个你认为的答案。。。

是的,你是对的。所以…继续这个问题。

我是否遗漏了此regex可能遗漏的任何类型的代码

它处理

多行评论

/*
    an easy one
*/

"行尾"评论

// Remove this

字符串中的注释

char array[] = "Following isn't a comment // because it's in a string /* this neither */";

这导致带转义引号的字符串

    char array[] = "Handle /* comments */ - // - in strings with '" escaped quotes";

和带逃逸的字符串

    char array[] = "Handle strings with **not** escaped quotes''"; // <-EOS

javscript单引号字符串

var myStr = 'Should also ignore enclosed // comments /* like these */ ';

线路连续

// This is a single line comment '
continuing on the next row (warns, but works in my C++ flavor)

那么,你能想出任何把这件事搞砸的代码案例吗如果你提出任何建议,我将尝试完成RE,希望它最终能完成;)

谨致问候。

PS。我知道。。。写这篇文章时,它在右侧窗格的如何提问下写道:我们更喜欢可以回答的问题,而不仅仅是讨论的问题这个问题可能违反了:S,但我无法抗拒。

事实上,对一些人来说,这甚至可能是一个答案,而不是一个问题。(太自大了?;)

我已经考虑了注释(到目前为止),并将正则表达式更改为:

(?:'/'/(?:'''n|[^'n])*'n)|(?:'/'*['s'S]*?'*'/)|((?:R"([^('''s]{0,16})'([^)]*')'2")|(?:@"[^"]*?")|(?:"(?:'?'?'|''''|''"|'''n|[^"])*?")|(?:'(?:''''|'''|'''n|[^'])*?'))

它处理Biffens C++11的原始字符串文字(以及C#逐字逐句的字符串),并根据Wiktors的建议进行了更改。

由于逻辑上的差异,将其拆分为单独处理单引号和双引号(并避免非工作反引用;)。

毫无疑问,它更复杂,但与我所看到的几乎不涉及字符串问题的解决方案相去甚远。它可以去掉不适用于特定语言的部分。

一条评论建议支持更多的语言。这将使RE(甚至更加)复杂和难以管理。不过,它应该相对容易适应。

更新了regex101示例。

感谢大家迄今为止的投入。并不断提出建议。

问候

编辑:更新原始字符串-这一次我实际阅读了规范;)