【问题标题】:How do you map input to multiple replacement values with a regular expression for C#如何使用 C# 的正则表达式将输入映射到多个替换值
【发布时间】:2015-07-17 08:35:44
【问题描述】:

我有两个输入值:

苹果

胡萝卜

我想找到一个正则表达式,我可以在 C# 程序中使用 Regex.Replace() 来识别这些输入并将它们替换为不相关的值。我没有机会更改代码。我只能提供输入、模式和替换参数。

例如:

如果找到 apple,则替换为 fruit

如果找到carrot,则替换为vegetable

我可以轻松地将它们与 ^apple|tomato$ 匹配,但我看不出有什么方法可以进行我想要的替换。唯一的替换选项似乎是来自输入的东西或奇异的固定值。

【问题讨论】:

  • 您可以访问 Regex.Replace 的哪些方法签名?你有这个权限吗:public static string Replace(string input, string pattern, MatchEvaluator evaluator)
  • 不,我们没有使用 MatchEvaluator。我唯一的选择是在配置文件中提供正则表达式和替换字符串,并希望有一些正则表达式的魔力可以让我避免修改产品代码并发明某种描述此配置的方式。似乎我们需要在下一个版本中添加。

标签: c# regex


【解决方案1】:

不幸的是,没有办法用一个 RegEx 替换来做到这一点。无法更改模式本身中捕获组的值,或“硬编码”模式中组的值。

但是,如果应用程序允许您提供多个将连续执行的模式/替换对,那么您可以通过提供对来实现:

  • 对 1
    • 模式:^apple$
    • 替换:fruit
  • 对 2
    • 模式:^tomato$
    • 替换:vegetable

【讨论】:

    【解决方案2】:

    不管Regex,都是映射,你可以像下面这样完成

    Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>()
    {
        {"fruit",new List<string>{"apple","orange"}},
        {"vegetable",new List<string>{"carrot"}}
    };
    Func<string, string> func = (inputStr) =>
    {
        var query = dic.FirstOrDefault(x => x.Value.Any(y => string.Equals(y, inputStr, StringComparison.OrdinalIgnoreCase)));
        return query.Key;
    };
    Console.WriteLine(func("apple"));
    Console.WriteLine(func("carrot"));
    Console.WriteLine(func("nothing")==null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-03
      • 2012-01-09
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多