【问题标题】:Replace strings many to many in C# [closed]在 C# 中多对多替换字符串 [关闭]
【发布时间】:2013-04-14 12:33:09
【问题描述】:

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

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

'b' 或 'B' 的字符改变了 'g' 或 'G',而不是我预期的 'd' 或 'D'。有没有其他选择可以解决这个障碍? 谢谢..

【问题讨论】:

  • 有什么问题? article = article.Replace('b', 'd').Replace('B', 'D'); 这不会将 b,B 更改为 d,D 吗?
  • 否,b 或 B 更改为 g 或 G,导致第二行。
  • 第二行覆盖第一行!
  • -1:您正在明确更改 b -> d -> g - 不确定您还期望什么。
  • 为了使问题更好,请添加您的目标或完整描述您希望实际替换如何工作。 IE。也许您想用另一个字符替换每个字符?

标签: c# string replace char character


【解决方案1】:

如果你说 b 的结局是 g 的,那么这是因为你是:

  1. b 更改为 d,然后,
  2. 将那些 d(以及原始 d)更改为 g

如果您尝试将 b 的字符更改为 d,并且然后更改那些在第 1 步进入 g 之前是 d 的字符,...
...然后按相反的顺序执行这些步骤。

  1. d 更改为 g,然后,
  2. 将那些 b 更改为 d

【讨论】:

    【解决方案2】:

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

    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 不能直接这样做,因为字符串是不可变的。

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

    【讨论】:

      【解决方案3】:

      正如其他人已经指出的那样,您首先进行 B -&gt; D 替换,然后是 D -&gt; G 替换。所以你真正在做的是B -&gt; GD -&gt; 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());
      

      【讨论】:

        猜你喜欢
        • 2014-10-10
        • 2014-07-13
        • 2015-03-05
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多