在C#中将字符串替换为多对多

时间:2013-04-21 15:48:03

标签: c# string replace char character

我有一个与String.Replace方法有关的问题。首先,我尝试将许多字符串更改为字母,例如

article = article.Replace('b', 'd').Replace('B', 'D');
article= article.Replace('d', 'g').Replace('D', 'G');

'b'或'B'的字符会改变'g'或'G',而不是'd'或'D'如我所料。还有其他方法可以解决这个障碍吗? 感谢..

3 个答案:

答案 0 :(得分:5)

如果您说 b 最终为 g ,那么这是因为您:

  1. b 更改为 d ,然后
  2. d &(以及原 d ' s)更改为 g &# 39; S
  3. 如果您尝试将 b 的字符更改为 d 然后只更改 在步骤1之前 d 的字符进入 g ' s,...
      ...然后按相反的顺序执行步骤。

    1. d 更改为 g ' s,
    2. b 更改为 d &#39>

答案 1 :(得分:0)

这是一项经常重复出现的任务。我建议创建一个扩展方法。将它放在静态类中。在使用扩展方法的地方,它的名称空间必须是“可见的”。

public static string TranslateChars(this string s, string originalChars,
                                                   string replacementChars)
{
    if (String.IsNullOrEmpty(s)) {
        return s;
    }
    if (originalChars == null) {
        throw new ArgumentNullException(originalChars);
    }
    if (replacementChars == null) {
        throw new ArgumentNullException(replacementChars);
    }
    if (originalChars.Length != replacementChars.Length) {
        throw new ArgumentException(
                   "'originalChars' and 'replacementChars' must have same length.");
    }

    // Fill translation dictionary
    var translations = new Dictionary<char, char>(originalChars.Length);
    for (int i = 0; i < originalChars.Length; i++) {
        translations.Add(originalChars[i], replacementChars[i]);
    }

    //Translate
    var sb = new StringBuilder(s);
    for (int i = 0; i < sb.Length; i++) {
        char replacement;
        if (translations.TryGetValue(sb[i], out replacement)) {
            sb[i] = replacement;
        }
    }
    return sb.ToString();
}

适用于您的问题:

article = article.TranslateChars("bBdD","dDgG");

注意:StringBuilder允许您替换文本中的单个字符,而这些字符不能直接使用string,因为字符串是不可变的。

此外,由于我们在一次通过中完成所有翻译,因此我们避免了您遇到的问题,即已翻译的字符已被无意中翻译过。

答案 2 :(得分:0)

正如其他人已经指出的那样,您首先进行B -> D替换,然后进行D -> G替换。所以你真正做的是B -> GD -> G

避免选择正确的替换顺序问题的声明方法如下:

var map = new Dictionary<char, char>
{
    { 'b', 'd' },
    { 'B', 'D' },
    { 'd', 'g' },
    { 'D', 'G' }
};

article = new string(article
    .Select(x => map.ContainsKey(x) ? map[x] : x)
    .ToArray());