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

使用含捕获组的正则字典时Regex.Replace()抛出KeyNotFoundException问题

问题分析与解决

问题背景

你尝试用正则表达式将100¢替换为100 cents,用字典存储多组正则模式(键)和替换值(值),但运行时抛出KeyNotFoundException,提示键100¢不存在于字典中。

错误原因

核心逻辑错误:

  • 字典的键是正则表达式字符串(比如@"(\d+)(¢)"),但你在Regex.Replace的回调里,用m.Value(即匹配到的实际内容100¢)去字典中查找对应值——字典里根本没有这个键,自然会报错。
  • 把多个正则用|拼接后,无法区分当前匹配来自哪条正则规则,也就没法正确映射到对应的替换值。

解决方法

方法一:遍历字典逐个替换(简单直接)

不需要拼接正则,直接遍历字典中的每一组规则,依次执行替换操作,逻辑清晰易懂,适合大多数场景:

var replacementsMap = new Dictionary<string, string>()
{
    {@"(\d+)(¢)", "$1 cents"},
    // 可添加更多替换规则
    {@"(\d+)\$", "$1 dollars"}
};

string input = "100¢ 50$";
Console.WriteLine(input); // 输出原始输入

foreach (var kvp in replacementsMap)
{
    input = Regex.Replace(input, kvp.Key, kvp.Value);
}

Console.WriteLine(input); // 输出:100 cents 50 dollars

方法二:自定义规则类存储正则与替换值(适合复杂场景)

如果需要更灵活的管理(比如预编译正则提升性能),可以定义一个类来存储每条替换规则,再遍历执行:

public class ReplacementRule
{
    public Regex RegexPattern { get; set; }
    public string ReplacementText { get; set; }
}

var replacementRules = new List<ReplacementRule>()
{
    new ReplacementRule 
    { 
        RegexPattern = new Regex(@"(\d+)(¢)", RegexOptions.Compiled), 
        ReplacementText = "$1 cents" 
    },
    new ReplacementRule 
    { 
        RegexPattern = new Regex(@"(\d+)\$", RegexOptions.Compiled), 
        ReplacementText = "$1 dollars" 
    }
};

string input = "100¢ 50$";
Console.WriteLine(input);

foreach (var rule in replacementRules)
{
    input = rule.RegexPattern.Replace(input, rule.ReplacementText);
}

Console.WriteLine(input);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34