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

我刚刚在这里读了一个新的问题,问我的标题基本上和我的一样。 这让我思考 – 并在网上搜索(当然,大多数点击指向SO)。 所以我认为 –

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

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

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

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

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

这部分的作用是捕获捕获组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 

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示例 。

感谢大家到目前为止的输入。 并保持建议。

问候

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