You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#正则替换C++构造函数成员初始化语法的方案咨询

解决方案

作为C#开发者,我们可以通过两步正则匹配替换精准完成需求,既不会误改代码里其他括号,也能覆盖跨多行、带注释、含内部函数调用的复杂场景:

1. 核心思路

先定位C++构造函数的完整成员初始化区域,再在该区域内将成员初始化的()替换为{},重点处理以下场景:

  • 空初始化(如dad::CRunnable() → dad::CRunnable{})
  • 带参数的初始化(如m_dragronFruit(PAD_GetdragronFruitPAD_B()) → m_dragronFruit{PAD_GetdragronFruitPAD_B()})
  • 跨多行带注释的初始化(保留注释和换行结构)

2. 完整C#代码实现

using System;
using System.Text.RegularExpressions;

class ConstructorInitConverter
{
    static void Main()
    {
        // 你的原始C++代码
        string inputCode = @"TropicalFruitTOutput::TropicalFruitTOutput()
   : dad::CRunnable()
   , m_watermelon_out()
#if MAX_FRUITS == (10)
   , m_cherry_out()
#endif
{
}

NationalFruitInput::NationalFruitInput()
   , m_banana_in()
   , m_dragronFruit(PAD_GetdragronFruitPAD_B())
{
}

SpecialFruits::SpecialFruits()
   : AmazingClassType()
   , m_kiwi()
   , m_avocado(  // PRQA S 2961 # FALSEPOSITIVE QAC warning about uninitialized
                                 // Hello world
                                 // This is just a comment for
                                 // testing purpose
        m_apricotController.getApricotList())
{
}

using NewFruitsBase::NewFruitsBase;";

        // 第一步:匹配所有构造函数区域,在每个区域内执行替换
        string convertedCode = Regex.Replace(
            inputCode,
            @"(?<=\s|^)(\w+)::\1\s*\([^)]*\)\s*([^{]+)",
            match => Regex.Replace(
                match.Value,
                // 平衡组正则:精准匹配成员初始化的顶层括号对,忽略内部嵌套括号
                @"(\b(?:\w+::)?\w+)\s*\(\s*((?:[^()]|(?<open>\()|(?<-open>\)))*(?(open)(?!)))\s*\)",
                "$1{$2}"
            ),
            RegexOptions.Singleline
        );

        Console.WriteLine(convertedCode);
    }
}

3. 正则说明

构造函数匹配正则

(?<=\s|^)(\w+)::\1\s*\([^)]*\)\s*([^{]+)
  • (?<=\s|^):确保构造函数前是空白或行首,避免误匹配其他代码
  • (\w+)::\1:匹配类名与构造函数名一致的结构(C++常规构造函数命名)
  • \s*\([^)]*\):匹配构造函数的参数列表(空或带参数)
  • \s*([^{]+):捕获从构造函数结束到{之前的所有内容(成员初始化、预编译指令、注释等)

括号替换正则(平衡组)

(\b(?:\w+::)?\w+)\s*\(\s*((?:[^()]|(?<open>\()|(?<-open>\)))*(?(open)(?!)))\s*\)
  • (\b(?:\w+::)?\w+):捕获成员初始化项的名称(基类或成员变量)
  • 平衡组部分:精准匹配括号内的所有内容,自动忽略内部嵌套的括号(比如函数调用里的())
  • 替换模式$1{$2}:将(内容)替换为{内容}

4. 效果验证

运行代码后输出的结果完全符合需求:

  • 所有成员初始化的()都替换为{}
  • 预编译指令、using声明、内部函数调用的括号不受影响
  • 跨多行的注释和格式完全保留

内容的提问来源于stack exchange,提问作者Bruce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:55:30