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

Şaf*_*Gür 6 c# string replace

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

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

  • 狗猫
  • 猫,老鼠,
  • 老鼠,猛禽

我有一个值为的字符串:

"My dog ate a cat which once ate a mouse got eaten by a raptor"
Run Code Online (Sandbox Code Playgroud)

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

"My cat ate a mouse which once ate a raptor got eaten by a raptor"
Run Code Online (Sandbox Code Playgroud)

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

"My raptor ate a raptor which once ate a raptor got eaten by a raptor"
Run Code Online (Sandbox Code Playgroud)

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

Aak*_*shM 9

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

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"
Run Code Online (Sandbox Code Playgroud)

我们在这里构建的模式看起来像(dog|cat|mouse).在此替换构造每件( | )被传递通过Regex.Escape,所以在键该正则表达式-有意义字符(例如|,^等),不会引起问题.找到匹配项后,匹配的文本将替换为字典中的相应值.该字符串仅扫描一次,因此没有重复匹配,因为迭代的问题string.Replace.