我需要使用C#互相替换字符串的某些部分。 我只能找到一个关于如何实现这个here的类似问题,但它是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"
如果以前没有问过这个很奇怪,(这是常识吗?)但我找不到任何东西。所以我很抱歉,如果它有,我错过了它。
答案 0 :(得分: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"
我们在这里构建的模式看起来像(dog|cat|mouse)
。此交替构造( | )
中的每个部分都通过Regex.Escape
传递,因此键中的正则字符有意义的字符(例如|
,^
等)不会导致问题。找到匹配项后,匹配的文本将替换为字典中的相应值。该字符串仅扫描一次,因此没有重复匹配,因为迭代string.Replace
的问题也是如此。
答案 1 :(得分:1)
你想要的是同时执行所有字符串替换,这样你就不会在同一个令牌上进行多次替换,对吗?
我可以想到两种方法,既不特别优雅: