【问题标题】:regex replace single line c++ comments正则表达式替换单行 C++ 注释
【发布时间】:2017-11-16 07:32:00
【问题描述】:

我想在我的项目中插入 doxygen cmets。我想尽可能自动地做到这一点,所以我想到了使用正则表达式以及搜索和替换功能。
示例:

int var; //Explanation variable

进入:

int var; /**< @brief Explanation variable */

作为奖励,我也不想删除我的代码意图。
我尝试了不同的方法,例如

查找:.+;*// .+(查找相关行)
替换:.+;*/**&lt; @brief .+ */

问题是,它没有插入原始文本,而是将正则表达式作为纯文本插入,并删除了预期的代码。 有没有办法正确解决这个问题?我已经阅读了许多不同的帖子,但我无法让它工作。

【问题讨论】:

  • 使用捕获组/反向引用:(.+;\s*)//\s*(.+) -> $1/**&lt; @brief $2 */
  • 您需要在捕获组中捕获原始文本,并在替换中使用反向引用。我不知道您使用什么工具进行这些替换以及使用什么正则表达式引擎?
  • @Doqnach 我使用的是 VS2017,但我也可以使用 Eclipse Luna 或 Notepad++。我会使用任何需要的东西。
  • @xMutzelx:那C++标签就无关紧要了,我去掉了。
  • 使用@WiktorStribiżew 的正则表达式,但在第一组中捕获较少:(.+;*)// *(.+)

标签: regex visual-studio comments


【解决方案1】:

你需要使用capturing groups和backreferences

查找内容(.+;\s*)//\s*([^\r\n]+)
替换为$1/**&lt; @brief $2 */

请参阅regex demo

详情

  • (.+;\s*) - 第 1 组(使用替换模式中的 $1 编号的反向引用访问其值):除换行符之外的任何一个或多个字符,;,然后是 0+ 个空格
  • // - 双重/
  • \s* - 0+ 个空格
  • ([^\r\n]+) - 第 2 组(使用替换模式中的 $2 编号的反向引用访问其值):除换行符 (\n) 和回车符 (\r) 以外的任何 1+ 字符(如 .匹配 .NET 正则表达式中的 CR (\r)。

VS 2015 测试:

【讨论】:

  • 感谢您的帮助,它几乎可以完美运行。最后一个问题是,结尾 */ 在新行上。
  • @xMutzelx:我猜(.+) 在你的情况下匹配\r - 用([^\r\n]+) 替换最后一个(.+)
  • 哇,它对你有用。在 VS2017 中,它会将 */ 放在新行上。
  • 我看到你最后的评论很晚,现在它工作正常。谢谢
  • 是的,它与(.+) 一起工作,因为它是文本的最后一行。一旦我在下面添加了一行,我就可以重现这个问题。 . 匹配除 .NET 正则表达式中的换行符以外的任何符号。在记事本++中,你不会有这个问题,你可以使用(.+)
【解决方案2】:

你可以试试这个:

^(\s*[^;]+;\s*)\/\/(.*)$

并替换为:

$1/**< @brief $2 */

Regex101Demo

【讨论】:

  • 感谢您的帮助,与上述答案相同的问题。结尾 */ 在新行中。
【解决方案3】:

我稍微修改了@WiktorStribizew 的解决方案,让它更舒服:

查找:(.+;[^\r\n]\s*)//\s*([^\r\n]+)

我在前面插入了[^\r\n],以避免一些特殊情况,例如:

int var;
//Comment for the next function
int function ()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-05-18
    • 2014-12-08
    • 2014-09-02
    • 2013-08-22
    • 2019-09-27
    • 2020-07-18
    相关资源
    最近更新 更多