使用C#正则表达式替换模板关键词的代码测试问题
解决模板关键词替换的正则方案
嘿,我来帮你把这个模板替换的问题搞定!你已经有了一个不错的开头,不过咱们可以把正则和替换逻辑优化得更稳定好用。
首先看你写的正则(?<=\{{2})[^}}]*(?=\}{2}),其实思路是对的,但可以调整得更严谨——比如换成(?<=\{{2})([^{}]+)(?=\}{2}),这样能确保只匹配{{和}}之间不包含大括号的内容,避免意外匹配到嵌套或者无效的格式。
接下来给你完整的可运行代码,用Regex.Replace的MatchEvaluator重载来动态从字典里取值替换,还能处理字典里没有的关键词(保留原格式避免出错):
using System; using System.Collections.Generic; using System.Text.RegularExpressions; class TemplateReplacer { static void Main() { string input = "Welcome {{friend}} Get my new {{id}} with {{anonymous}} People"; Dictionary<string, string> mydict = new Dictionary<string, string>(); mydict.Add("friend", "<<My Friend>>"); mydict.Add("id", "<<Your ID>>"); // 优化后的正则:精准匹配{{关键词}}中的关键词部分 string pattern = @"(?<=\{{2})([^{}]+)(?=\}{2})"; // 用MatchEvaluator处理每个匹配项 string result = Regex.Replace(input, pattern, match => { string key = match.Groups[1].Value.Trim(); // 顺便处理关键词前后的空格(如果有的话) if (mydict.TryGetValue(key, out string value)) { return value; } // 如果字典里没有这个关键词,保留原{{key}}格式 return $"{{{{{key}}}}}"; }); Console.WriteLine(result); // 输出:Welcome <<My Friend>> Get my new <<Your ID>> with {{anonymous}} People } }
几个关键点说明:
- 正则表达式:
(?<=\{{2})是正向预查,确保前面是两个{;([^{}]+)捕获中间的有效关键词(非大括号字符);(?=\}{2})是正向预查,确保后面是两个}。这样不会把{{和}}本身包含在匹配结果里,直接拿到关键词。 - MatchEvaluator的优势:比起简单的替换,它能让我们对每个匹配项做逻辑处理——比如这里的
TryGetValue避免了键不存在时的报错,还能保留原模板格式,非常实用。 - 避开你之前的坑:你注释掉的那些正则比如
@"\{{2}^(.*?)$\}{2}"是错的,因为^和$是行首尾匹配符,而你的模板是一行里多个关键词,根本匹配不到;"^[{{\\w}}]$"则是匹配单个字符,完全不符合需求。
内容的提问来源于stack exchange,提问作者Marks
相关产品推荐
相关产品推荐

