Как заменить * первый экземпляр * строки в .NET? - PullRequest
99 голосов
/ 26 сентября 2008

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

Как мне это сделать в .NET?

Ответы [ 13 ]

124 голосов
/ 26 сентября 2008
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");

EDIT : Как @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");
57 голосов
/ 29 сентября 2008

Как сказал itsmatt 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 для этого.

16 голосов
/ 26 сентября 2008

Взгляните на Regex.Замена .

15 голосов
/ 03 ноября 2010

Принимая во внимание «только первый», возможно:

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");
9 голосов
/ 10 июня 2010
using System.Text.RegularExpressions;

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

сначала найдет F в InputString и заменит его на R.

8 голосов
/ 26 сентября 2008

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

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

Наслаждайтесь

8 голосов
/ 26 сентября 2008

Синтаксис в C #:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
4 голосов
/ 03 ноября 2010

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

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

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

4 голосов
/ 26 сентября 2008

И поскольку есть еще 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
3 голосов
/ 03 ноября 2010

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

string output = (new Regex("AA")).Replace(input, "XQ", 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...