How do I replace the *first instance* of a string in .NET?

后端 未结 14 961
忘掉有多难
忘掉有多难 2020-11-22 16:41

I want to replace the first occurrence in a given string.

How can I accomplish this in .NET?

相关标签:
14条回答
  • 2020-11-22 17:00

    Taking the "first only" into account, perhaps:

    int index = input.IndexOf("AA");
    if (index >= 0) output = input.Substring(0, index) + "XQ" +
         input.Substring(index + 2);
    

    ?

    Or more generally:

    public static string ReplaceFirstInstance(this string source,
        string find, string replace)
    {
        int index = source.IndexOf(find);
        return index < 0 ? source : source.Substring(0, index) + replace +
             source.Substring(index + find.Length);
    }
    

    Then:

    string output = input.ReplaceFirstInstance("AA", "XQ");
    
    0 讨论(0)
  • 2020-11-22 17:00

    Updated extension method utilizing Span to minimize new string creation

        public static string ReplaceFirstOccurrence(this string source, string search, string replace) {
            int index = source.IndexOf(search);
            if (index < 0) return source;
            var sourceSpan = source.AsSpan();
            return string.Concat(sourceSpan.Slice(0, index), replace, sourceSpan.Slice(index + search.Length));
        }
    
    0 讨论(0)
  • 2020-11-22 17:02

    For anyone that doesn't mind a reference to Microsoft.VisualBasic, there is the Replace Method:

    string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
    
    0 讨论(0)
  • 2020-11-22 17:04
    string ReplaceFirst(string text, string search, string replace)
    {
      int pos = text.IndexOf(search);
      if (pos < 0)
      {
        return text;
      }
      return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
    }
    

    Example:

    string str = "The brown brown fox jumps over the lazy dog";
    
    str = ReplaceFirst(str, "brown", "quick");
    

    EDIT: As @itsmatt mentioned, there's also Regex.Replace(String, String, Int32), which can do the same, but is probably more expensive at runtime, since it's utilizing a full featured parser where my method does one find and three string concatenations.

    EDIT2: If this is a common task, you might want to make the method an extension method:

    public static class StringExtension
    {
      public static string ReplaceFirst(this string text, string search, string replace)
      {
         // ...same as above...
      }
    }
    

    Using the above example it's now possible to write:

    str = str.ReplaceFirst("brown", "quick");
    
    0 讨论(0)
  • 2020-11-22 17:10
    string abc = "AAAAX1";
    
                if(abc.IndexOf("AA") == 0)
                {
                    abc.Remove(0, 2);
                    abc = "XQ" + abc;
                }
    
    0 讨论(0)
  • 2020-11-22 17:15

    One of the overloads of Regex.Replace takes an int for "The maximum number of times the replacement can occur". Obviously, using Regex.Replace for plain text replacement may seem like overkill, but it's certainly concise:

    string output = (new Regex("AA")).Replace(input, "XQ", 1);
    
    0 讨论(0)
提交回复
热议问题