c - 匹配 C 样式(单行)注释并替换为块注释(Notepad++ 中的 RegEx)
问题描述
我需要在我的代码中将 C 样式的单行注释转换为块样式的注释(而不是相反),以便向后兼容 C99 之前的项目。
如何在 Notepad++ 中使用正则表达式来实现这一点?
解决方案
简短但近似的解决方案
\/\/([^\/]+?)$
替换:
/*\1*/
这匹配以 开头且不包含的最小可能字符串。//
/
这打破了以下评论:
x = "hello world"; // broken // comment
在这种情况下,它只会匹配// comment
而不匹配// broken // comment
。
但这适用于包含//
. 例如:
x = "test // test" // comment
这将只匹配//comment
。
此外,它无法处理以下评论:
test = 1; // /**/
更长但正确的解决方案
//
如果我们看到并且我们不在字符串或块评论中,我们想开始捕获评论。
所以我们可以构建这个FSA来识别字符串之外的注释并阻止注释。
这个 FSA 可以用Thompson 的构造转换为正则表达式。
结果是:
^(([^\/'"]+|'(([^\\']*|\\.)*)'|"(([^\\"]*|\\.)*)"|\/\*.*?\*\/)*)\/\/(.*)$
有替换
\1\/*\7*\/
推荐阅读
- c - 以 i++ 为条件的 C for 循环的奇怪行为
- google-maps - 谷歌地图 API 不会显示
- javascript - 字符串中的双括号模式搜索
- c# - Web 服务内部不同的soap:address。如何调用方法
- c# - 在 VB.NET 中传递给函数时声明参数
- node.js - 由于 SELF_SIGNED_CERT_IN_CHAIN,Expo 无法更新 npm 包
- docker - 使用 nginx、kubernetes 和 docker 服务资产
- c++ - Must a compiler always remove a try-catch block if it's proven to be non-throwing
- java - Java中的10,000,000个整数数组插入排序
- mysql - MySQL 数据库 Show Lik 'רולר חו×'