如何将两个或多个字符串相互替换

本文关键字:字符串 替换 两个 | 更新日期: 2023-09-27 18:27:05

我需要使用C#将字符串的某些部分相互替换。我在这里只能找到一个关于如何实现这一点的类似问题,但它是PHP。

我的情况涉及一个Dictionary[string,string],它包含要替换的对,比如:

  • 狗、猫
  • 猫、老鼠、
  • 猛禽鼠标

我有一个字符串,值为:

"My dog ate a cat which once ate a mouse got eaten by a raptor"

我需要一个函数来获得这个:

"My cat ate a mouse which once ate a raptor got eaten by a raptor"

如果我列举字典和调用字符串。按订单替换,我得到的是:

"My raptor ate a raptor which once ate a raptor got eaten by a raptor"

如果以前没有人问过这个问题,那就很奇怪了,(这是常识吗?)但我找不到。所以,如果它有,我很抱歉,我错过了。

如何将两个或多个字符串相互替换

因此,您需要的是匹配过程只发生一次。这一次,我认为正确的答案实际上是"使用regex"!这里有一些代码:

var replacements = new Dictionary<string, string>
                       {
                           { "do|g", "cat" },
                           { "ca^t", "mouse" },
                           { "mo$$use", "raptor" }
                       };
var source = "My do|g ate a ca^t which once ate a mo$$use";
var regexPattern = 
    "(" + 
    string.Join("|", replacements.Keys.Select(Regex.Escape)) +
    ")";
var regex = new Regex(regexPattern);
var result = regex.Replace(source, match => replacements[match.Value]);
// Now result == "My cat ate a mouse which once ate a raptor"

我们在这里构建的模式看起来像(dog|cat|mouse)。这个交替结构( | )中的每一个片段都通过Regex.Escape传递,这样键中有regex意义的字符(如|^等)就不会引起问题。当找到匹配项时,匹配的文本将替换为字典中的相应值。字符串只扫描一次,因此不存在重复匹配,就像迭代string.Replace的问题一样。

您想要的是同时执行所有字符串替换,这样就不会在同一个令牌上得到多个替换,对吧?

我能想到两种方法,都不是特别优雅:

  • 按特定顺序遍历字典,因此您总是将鼠标/猛禽替换为猫/鼠标
  • 不要将cat替换为"mouse",而是将其替换为"$mouse$"或类似的标记。这将确保"$mouse$"不会被"raptor"(或者,实际上是"$raptor$")取代。然后,一旦完成切换,就可以删除所有"$"标志