如何从代码中删除 C-style 注释

How to remove C-style comments from code

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

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

是的,SO 上有这个 question/statement 的答案,但我发现的答案都不完整 and/or 过于复杂。

所以我开始试验,想出了一个适用于所有类型代码的方法可以想象:

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

第一个备选方案检查 双斜线 // 评论。第二个 普通 /* comment */。第三个是我在寻找处理相同任务处理的其他正则表达式时遇到的麻烦 - 包含字符串外部字符序列的字符串将被视为注释.

这部分的作用是捕获捕获组一中的任何字符串,匹配捕获组二中的引号到引号,直到字符串的末尾。

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

Here's a C example at regex101.

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

是的,你是对的。那么……进入正题。

我是否遗漏了此正则表达式会遗漏的任何类型的代码?

它处理

多行注释

/*
    an easy one
*/

"end of line" 评论

// 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})\([^)]*\)")|(?:@"[^"]*?")|(?:"(?:\?\?'|\\|\"|\\n|[^"])*?")|(?:'(?:\\|\'|\\n|[^'])*?'))

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

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

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

一条评论建议支持更多语言。这将使 RE(甚至更加)复杂且难以管理。不过应该比较容易适应。

Updated regex101 example.

感谢大家到目前为止的投入。并不断提出建议。

此致

编辑: 更新原始字符串 - 这次我真正阅读了规范。 ;)