C#实现不区分大小写的Regex.Replace字典文本替换
不区分大小写替换方括号占位符的解决方案
核心问题在于直接使用Regex.Replace加IgnoreCase选项时,无法关联字典中大小写固定的键。正确的做法是利用MatchEvaluator委托,在匹配到占位符后,统一转换为字典键的大小写格式(比如全小写),再从字典中取值替换。
实现步骤
- 定义匹配方括号占位符的正则表达式:
\[([^\]]+)\],匹配[]包裹的任意内容 - 启用
RegexOptions.IgnoreCase确保匹配任意大小写的占位符 - 通过
MatchEvaluator处理每个匹配结果:提取占位符内容,转换为与字典键一致的大小写(比如全小写),再从字典中获取对应值替换
代码示例(C#)
using System; using System.Text.RegularExpressions; using System.Collections.Generic; class Program { static void Main() { string template = "My name is [NAME] and I'm [Age] years old"; Dictionary<string, string> replacements = new Dictionary<string, string> { {"name", "Alice"}, {"age", "30"} }; // 正则匹配方括号内的内容,忽略大小写 string result = Regex.Replace( template, @"\[([^\]]+)\]", match => { // 将匹配到的占位符内容转小写,匹配字典键 string key = match.Groups[1].Value.ToLower(); // 存在则替换,不存在保留原占位符 return replacements.TryGetValue(key, out string value) ? value : match.Value; }, RegexOptions.IgnoreCase ); Console.WriteLine(result); // 输出: My name is Alice and I'm 30 years old } }
关键说明
- 正则表达式
\[([^\]]+)\]:\[和\]转义匹配方括号,([^\]]+)捕获括号内的非右括号内容作为分组 RegexOptions.IgnoreCase让正则忽略占位符的大小写(比如匹配[NAME]、[Name]、[name])MatchEvaluator委托中,通过ToLower()将捕获的占位符内容转换为字典键的大小写(如果字典键是全大写则用ToUpper()),再通过TryGetValue安全取值,避免键不存在时抛出异常
内容的提问来源于stack exchange,提问作者Martyx
相关产品推荐
相关产品推荐

