首页 > 解决方案 > 匹配 C 样式(单行)注释并替换为块注释(Notepad++ 中的 RegEx)

问题描述

我需要在我的代码中将 C 样式的单行注释转换为块样式的注释(而不是相反),以便向后兼容 C99 之前的项目。

如何在 Notepad++ 中使用正则表达式来实现这一点?

标签: cregexnotepad++

解决方案


简短但近似的解决方案

\/\/([^\/]+?)$

替换:

/*\1*/

这匹配以 开头且不包含的最小可能字符串。///

这打破了以下评论:

x = "hello world"; // broken // comment

在这种情况下,它只会匹配// comment而不匹配// broken // comment

但这适用于包含//. 例如:

x = "test // test" // comment

这将只匹配//comment

此外,它无法处理以下评论:

test =  1; // /**/

这里有一些关于 Regex101 的例子 在此处输入图像描述

更长但正确的解决方案

//如果我们看到并且我们不在字符串或块评论中,我们想开始捕获评论。

所以我们可以构建这个FSA来识别字符串之外的注释并阻止注释。

在此处输入图像描述

这个 FSA 可以用Thompson 的构造转换为正则表达式。

结果是:

^(([^\/'"]+|'(([^\\']*|\\.)*)'|"(([^\\"]*|\\.)*)"|\/\*.*?\*\/)*)\/\/(.*)$

有替换

\1\/*\7*\/

这里有一些关于 Regex101 的例子 在此处输入图像描述


推荐阅读