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

我需要使用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" 

如果我枚举字典并按顺序调用string.Replace,我得到:

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

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

所以你需要的是匹配过程只发生一次。 我认为正确的答案实际上是’使用正则表达式’! 这是一些代码:

 var replacements = new Dictionary { { "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传递,因此键中的正则字符有意义的字符(例如|^等)不会导致问题。 找到匹配项后,匹配的文本将替换为字典中的相应值。 该字符串仅扫描一次,因此没有重复匹配,因为迭代string.Replace的问题。

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

我可以想到两种方法,既不特别优雅:

  • 按特定顺序迭代你的字典,所以你总是在cat / mouse之前替换mouse / raptor。
  • 而不是用’鼠标’替换猫,而是用’$ mouse $’或类似的标记替换它。 这将确保’$ mouse $’不会被’raptor’(实际上是’$ raptor $’)取代。 然后,一旦完成开关,就可以删除所有“$”符号。