当前位置: 首页 > 面试题库 >

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

柳德义
2023-03-14
问题内容

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

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

问候

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



 类似资料:
  • 问题内容: 似乎每次我想执行数据库查询时,我都必须编写以下内容: 这真的是最好的方法吗?有没有办法至少减少一些混乱? 编辑:作为一些评论指出的那样,这个代码不长 不够 。 问题答案: 如果您已经有一个数据源,则可以将Spring JdbcTemplate 用于: 大大减少了样板代码 具有良好的sql异常层次结构,可以处理具有特定运行时异常的常见数据库问题 (随后在Spring中进一步使用)使用声明

  • 问题内容: 我选择jQuery Mobile而不是其他框架来获得动画效果和动态页面支持。 但是,我在样式方面遇到麻烦。我想保留基本的页面样式以便执行页面转换。但是我还需要完全自定义标题,列表视图,按钮,搜索框的外观……仅处理颜色是不够的。我需要处理尺寸,位置,边距,填充等。 因此,为了用CSS覆盖它们,我在jQuery Mobile中添加了额外的div和类而感到困惑。但这非常耗时,从头重写CSS会

  • 问题内容: 从PHP文件中删除注释的最佳方法是什么? 我想做一些与strip-whitespace()类似的事情-但它也不应该删除换行符。 例如: 我要这个: 成为: (尽管如果在删除注释的地方仍然留有空行,那是不可能的)。 由于可能需要保留嵌入式html,因此这可能是不可能的-那是什么导致了google上出现的问题。 问题答案: 我会使用tokenizer。这是我的解决方案。它应该在PHP 4和

  • 本文向大家介绍PHP正则删除HTML代码中宽高样式的方法,包括了PHP正则删除HTML代码中宽高样式的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP正则删除HTML代码中宽高样式的方法。分享给大家供大家参考,具体如下: 因工作需要,需要采集html,并把html内容保存到数据库中。为了避免影响使用,宽高样式需要删除。例如图片和div中的width, height等。 不过采集到

  • 如何(使用PHP)从具有特定类的div中删除样式属性?因为“拖累” 我知道我可以在“拖动”后用JavaScript删除样式属性

  • 我想删除索引。php来自codeigniter中的url。所以在用户指南中,有一种方法可以通过编辑来实现。htaccess。但是我的主机不允许编辑它。有没有办法处理codeigniter的代码?谢谢