【问题标题】:Character replacement in string字符串中的字符替换
【发布时间】:2011-07-02 14:21:48
【问题描述】:

我确实需要一个有效的 ASP.NET C# 代码来替换字符串中的字符。

我的以下代码工作正常,但在输入“a”的情况下,它给我的输出为“678d”,但在输入“c”的情况下,输出是正确的,即“8d”......在这里也会自动替换其余值。我可以看到代码正在逐步执行...这导致我得到一个重载的输出。

{
    StringBuilder builder = new StringBuilder();
    builder.Replace("a", "6b");
    builder.Replace("b", "7c");
    builder.Replace("c", "8d");
    return builder.ToString();
}

现在,我确实需要将“a”替换为“6b”,它不应该加载其余值。

【问题讨论】:

    标签: c# asp.net string character-encoding character-replacement


    【解决方案1】:

    您需要更改替换的顺序:

    StringBuilder builder = new StringBuilder();
    builder.Replace("c", "8d");
    builder.Replace("b", "7c");
    builder.Replace("a", "6b");
    return builder.ToString();
    

    【讨论】:

    • 感谢您的回答,但我刚刚给出了一个示例代码。在我的原始代码中,一个位必须替换为 1000 位,因此,更改顺序将导致无用。我需要一个代码,它独立运行每一行,而不依赖于下一行或前一行...
    • 我想这将可能使用数组语句...不确定但只是一个公平的猜测...!
    【解决方案2】:

    您的代码从一个语句下降到其他语句 - 所以首先将 a 替换为 6b,然后将 6b 的 b 替换为 7c,依此类推。

    因此,在您的具体情况下,您可以调整语句的顺序,以便后面的语句不会对前面的语句做出反应 - 比如

    builder.Replace("c", "8d");

    builder.Replace("b", "7c");

    builder.Replace("a", "6b");

    【讨论】:

      【解决方案3】:

      为了更加独立于实际替换,您可以进行两种替换:

      首先将出现的地方替换为不会出现在字符串中的占位符(如 %%1%% 替换“a”,%%2%% 替换“b”等)。

      然后在第二次运行中,将 %%1%% 替换为“8d”,将 %%2%% 替换为“7c”等。

      这在任何情况下都有效。

      【讨论】:

      • 感谢您的回答希望它在某些情况下对我有所帮助...但是代码变得混乱...无论如何非常感谢...
      【解决方案4】:

      试试这个:

      Regex rx = new Regex("a|b|c");
      
      string str = "abc";
      
      MatchEvaluator matcher = match => {
          string value = match.Value;
          if (value == "a") {
              return "6b";
          } else if (value == "b") {
              return "7c";
          } else {
              return "8d";
          }
      };
      
      var str2 = rx.Replace(str, matcher);
      

      如果您不想使用正则表达式,则使用此方法:

      static void Main(string[] args)
      {
          var replacements = new[] {
              new Tuple<string, string>("a", "6b"), 
              new Tuple<string, string>("b", "6c"), 
              new Tuple<string, string>("c", "6a")
          };
      
          string str = "adbc";
          var str2 = MultipleReplace(str, replacements);
      }
      
      static string MultipleReplace(string str, IEnumerable<Tuple<string, string>> replacements) {
          StringBuilder str2 = new StringBuilder();
      
          for (int i = 0; i < str.Length; i++) {
              bool found = false;
      
              foreach (var rep in replacements) {
                  if (str.Length - i >= rep.Item1.Length && str.Substring(i, rep.Item1.Length) == rep.Item1) {
                      str2.Append(rep.Item2);
                      i += rep.Item1.Length - 1;
                      found = true;
                      break;
                  }
              }
      
              if (!found) {
                  str2.Append(str[i]);
              }
          }
      
          return str2.ToString();
      }
      

      【讨论】:

      • 您必须添加using System.Text.RegularExpressions
      • error namespace tuple and IEnumerable cannot be found :( 希望此代码有效,但只有一些错误,请进一步帮助我...谢谢您的回答...
      • @Karthik 在有错误的代码上右键,解决并选择以“使用”开头的第一行。第一个示例需要 .NET 3.5,第二个示例需要 .NET 4.0。
      【解决方案5】:

      您可以在字母后面使用空格。如在 "a" 中用 "a" 替换 "a" 为所需的文本。

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 2020-03-08
        • 2012-04-26
        • 1970-01-01
        • 2013-01-04
        相关资源
        最近更新 更多