如何编写支持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
- 匹配
- 产生2个独立匹配:
规则逻辑说明
该实现完全遵循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
相关产品推荐
相关产品推荐

