繁体   English   中英

如何从代码中删除 C 风格的注释

[英]How to remove C-style comments from code

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

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

是的,这个问题/声明有关于 SO 的答案,但我发现的那些都是不完整的和/或过于复杂的。

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

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

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

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

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

这是 regex101 中的 C 示例。

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

你是对的。 所以……开始提问。

我是否错过了这个正则表达式会错过的任何类型的代码?

它处理

多行注释

/*
    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

javascript 单引号字符串

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,并希望它最终完成;)

问候。

附注。 我知道... 写这个是在右侧窗格中的“如何提问”下我们更喜欢可以回答的问题,而不仅仅是讨论。 这个问题可能违反了 :S 但我无法抗拒。

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

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

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

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

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

毫无疑问,它更复杂,但与我见过的解决方案相去甚远,这些解决方案几乎没有涵盖任何字符串问题 它可以被剥离不适用于特定语言的部分。

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

更新了 regex101 示例

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

问候

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM