You need to enable JavaScript to run this app. 如何编写支持C#双写花括号转义的正则,匹配花括号内字符串并捕获目标内容
优惠活动
大模型
产品
解决方案
定价
更多

如何编写支持C#双写花括号转义的正则,匹配花括号内字符串并捕获目标内容

适配C#双写花括号转义规则的正则实现

核心正则表达式

(?<=(?<!{)({{)*){(?!{)([^{}]+)(?<!})}(?=(?!})(}})*)

全量用例验证

  • 用例1:文本Hola {name}
    • 匹配完整片段:{name}
    • 捕获组1提取内容:name
  • 用例2:文本Hola {name}, this will be {{unmatched}}
    • 仅匹配有效片段{name},双写花括号包裹的{{unmatched}}作为字面量完全跳过,不会产生匹配
  • 用例3:文本Buenos {{{dias}}}
    • 最外层连续双花括号识别为转义字面量,仅匹配内层有效片段{dias},捕获内容dias
  • 用例4:汇总文本Hola {name}, buenos {{{dias}}}
    • 产生2个独立匹配:
      • 匹配{name},捕获name
      • 匹配{dias},捕获dias

规则逻辑说明

该实现完全遵循C#插值字符串的双写花括号转义逻辑,解决旧正则(?<!{){[^{}]+}(?!})无法处理连续3个及以上花括号嵌套转义的缺陷:

  • 左边界判断:匹配的起始{,必须满足前面是偶数个连续{(即前面的连续{全部成对作为转义字面量),且当前{后面不是{(避免和下一个{组成转义对)
  • 匹配内容:边界之间的内容不包含任何{或},避免嵌套结构误匹配
  • 右边界判断:匹配的结束},必须满足后面是偶数个连续}(即后面的连续}全部成对作为转义字面量),且当前}前面不是}(避免和上一个}组成转义对)

C# 替换实现示例

// 初始化变量映射字典
var valueMap = new Dictionary<string, string>
{
    ["name"] = "Miguel",
    ["dias"] = "tardes"
};
var input = "Hola {name}, buenos {{{dias}}}";
// 执行正则替换
var result = Regex.Replace(
    input,
    @"(?<=(?<!{)({{)*){(?!{)([^{}]+)(?<!})}(?=(?!})(}})*)",
    match => valueMap.TryGetValue(match.Groups[1].Value, out var val) ? val : match.Value
);
// 最终输出:Hola Miguel, buenos {tardes}

注意:替换过程中双写的转义花括号会保留原字面含义,不会被正则消耗,和C#官方插值字符串的解析表现完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 16:54:05