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

时间:2016-04-06 14:25:17

标签: javascript java c++ regex comments

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

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

是的,关于SO的问题/陈述有答案,但是我找到的答案,都是不完整和/或过于复杂。

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

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

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

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

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

Here's a C example at regex101.

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

是的,你是对的。所以......关于这个问题。

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

处理

多行评论

/*
    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但是我无法抗拒。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

将它拆分为单独处理单引号和双引号,因为逻辑不同(并避免非工作后引用;)。

它无疑更复杂,但距离我在那里看不到任何字符串问题的解决方案还很远。它可能会被剥夺不适用于特定语言的部分。

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

Updated regex101 example

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

此致

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