Как заменить * первый экземпляр * строки в .NET?

Я хочу заменить первое вхождение в данной строке.

Как я могу выполнить это в .NET?

Ответ 1

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);
}

Пример:

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

РЕДАКТИРОВАТЬ: как @itsmatt упомянутый, также есть Regex.Replace(String, String, Int32), который может сделать то же самое, но, вероятно, дороже во время выполнения, поскольку он использует полный признак парсера, где мой метод позволяет найти и три конкатенации строк.

EDIT2. Если это общая задача, вы можете сделать метод методом расширения:

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

Используя приведенный выше пример, теперь можно написать:

str = str.ReplaceFirst("brown", "quick");

Ответ 2

Как говорится в нем, Regex.Replace является хорошим выбором для этого, но чтобы сделать его ответ более полным, я заполню его образцом кода

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

Третий параметр, равный 1 в этом случае, представляет собой число вхождений шаблона регулярного выражения, которое вы хотите заменить во входной строке, начиная с начала строки.

Я надеялся, что это можно сделать с помощью статической Regex.Replace перегрузки, но, к сожалению, вам, возможно, понадобится экземпляр Regex для выполнения.

Ответ 4

Принимая во внимание только "первое", возможно:

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

?

Или в более общем плане:

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);
}

Тогда:

string output = input.ReplaceFirstInstance("AA", "XQ");

Ответ 5

using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

найдет первую F в InputString и заменит ее на R.

Ответ 6

В синтаксисе С#:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);

Ответ 7

Метод расширения С#, который сделает это:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

Enjoy

Ответ 8

И поскольку есть и VB.NET, я бы хотел предложить:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function

Ответ 9

Предполагается, что AA нужно заменить, только если он находится в самом начале строки:

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

Если вам нужно заменить первое вхождение AA, начнется ли с него строка или нет, перейдите к решению от Marc.

Ответ 10

Одна из перегрузок Regex.Replace принимает значение int для "Максимальное количество раз, когда может произойти замена". Очевидно, использование Regex.Replace для замены обычного текста может показаться излишним, но это, безусловно, кратким:

string output = (new Regex("AA")).Replace(input, "XQ", 1);

Ответ 11

Regex.Replace, особенно RegEx.Replace(строка, строка, int), вероятно, то, что вы ищете. Это или String.IndexOf, который даст вам индекс, а затем вы можете вырезать и перестроить строку с нужным новым текстом.

Пример, демонстрирующий последний (впервые продемонстрированный @David Humpohl):

string str = "Hello WorldWorld";

str = ReplaceFirst(str, "World", "StackOverflow ");

...

string ReplaceFirst(string text, string search, string replace)
{
    int pos = text.IndexOf(search);
    if (pos >= 0)
    {
        return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
    }
    return text;
}

Ответ 12

Для тех, кто не возражает против ссылки на Microsoft.VisualBasic, существует Replace Метод:

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"

Ответ 13

В этом примере абстрагируются подстроки (но медленнее), но, вероятно, намного быстрее, чем RegEx:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];

Ответ 14

string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }