【问题标题】:C# Replacing part of string by start and end positionC#用开始和结束位置替换字符串的一部分
【发布时间】:2011-09-23 18:05:48
【问题描述】:

我有一个字符串,我想替换它的一部分。 棘手的部分是我不能使用 Regex.replace,因为我只知道字符串中数据的开始和结束位置。 例如,如果字符串如下所示:

I love cats, some more stuff here, we dont know how much more

我有start=8end=11。我想把那部分换成我需要的任何东西。这次让我们说dogs,所以新字符串看起来像:

I love dogs, some more stuff here, we dont know how much more

我怎么能这样做?

【问题讨论】:

标签: c# string replace


【解决方案1】:

最简单的方法:

string replaced = original.Substring(0, start) + replacementText + 
                  original.Substring(end);

我原以为 StringBuilder 会有一些东西可以做到这一点,但我认为你必须先打电话给 Remove 然后再打电话给 Insert

【讨论】:

  • RemoveInsert 上的string 怎么样?
  • @Gabe:是的,这会起作用——我认为它最终会得到更少的中间字符串值,但更多的复制。我想我也会发现这段代码更容易理解:)
【解决方案2】:
str.Substring(0, 8) + "replacement" + str.Substring(11);

它并不“优雅”,但它确实有效。

【讨论】:

    【解决方案3】:
    string newString = 
     String.Concat(
            originalString.Substring(0, start),
            replacementText, 
            originalString.Substring(end));
    

    StringBuilder sb = new StringBuilder(originalString);
    sb
      .Remove(start, length)
      .Insert(start, replacementText);
    

    【讨论】:

    • 你为什么使用 StringBuilder?
    • StringBuilder 会快一点。 String.Concat 也在内部使用它。然而,对于连接的 3 部分,简单的 '+' 可以工作得更快一些 - 所以当你改变字符串时,使用 StringBuilder 而不是 string 只是一个好习惯。
    【解决方案4】:

    只是为了好玩 LINQ:

    const string S = "I love cats, some more stuff here, we dont know how much more";
    const string Dogs = "dogs";
    
    var res = S
        .Take(7)
        .Concat(Dogs)
        .Concat(S.Where((c, i) => i > 10));
    
    var resultString = string.Concat(res);
    

    【讨论】:

      【解决方案5】:

      不优雅但有趣的解决方案:

      string myString = "I love cats, some more stuff here, we dont know how much more";
      
              Regex expr = new Regex("cats");
              int start = 8;
              int end = 11;
              Match m =expr.Match(myString);
              if (m.Index == start-1 && m.Length == end - (start-1))
              {
                  Console.WriteLine(expr.Replace(myString, "dogs")); 
              }
      

      【讨论】:

        【解决方案6】:

        ReplaceAt(int index, int length, string replace)

        这是一个不使用 StringBuilder 或 Substring 的扩展方法。此方法还允许替换字符串超出源字符串的长度。

        //// str - the source string
        //// index- the start location to replace at (0-based)
        //// length - the number of characters to be removed before inserting
        //// replace - the string that is replacing characters
        public static string ReplaceAt(this string str, int index, int length, string replace)
        {
            return str.Remove(index, Math.Min(length, str.Length - index))
                    .Insert(index, replace);
        }
        

        在使用该功能时,如果希望整个替换字符串替换尽可能多的字符,那么将length设置为替换字符串的长度:

        "0123456789".ReplaceAt(7, 5, "Salut") = "0123456Salut"
        

        否则,您可以指定要删除的字符数:

        "0123456789".ReplaceAt(2, 2, "Salut") = "01Salut456789"
        

        如果你指定长度为0,那么这个函数就像插入函数一样:

        "0123456789".ReplaceAt(4, 0, "Salut") = "0123Salut456789"
        

        我想这更有效,因为不需要初始化 StringBuilder 类,而且它使用更多基本操作。 希望对您有所帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-08
          • 1970-01-01
          • 2016-07-24
          • 2018-11-14
          • 2023-03-28
          • 1970-01-01
          • 2021-07-15
          相关资源
          最近更新 更多