微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

无疑,它更复杂,但与我所见过的几乎不能解决任何 字符串问题解决方案相距甚远。并且可以剥离不适用于特定语言的部分。

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

更新了regex101示例

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

问候

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

解决方法

我刚刚在此处阅读了一个新问题,询问的标题与我的基本相同。那让我开始思考-并在网络上搜索(当然,大多数点击都指向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但我无法抗拒。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。