2008-09-26 2 views
92

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

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

+0

Пожалуйста, четкие сообщения, что люди могут понять. Я тоже редактировал это для вас. Вы должны были указать язык, по крайней мере, здесь. – GEOCHET 2008-09-26 18:13:50

+0

Конечно, он никогда не заменяется * ... это всегда новая строка, содержащая исходную с замененным текстом. Это потому, что строка неизменна. – 2010-03-02 13:56:26

+0

Я попробовал метод `String.Replace()`. но он заменяет все «AA» на «XQ» – 2010-11-03 11:59:08

ответ

1

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; 
} 
116
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 mentioned, есть также 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"); 
6

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

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

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

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

4

А потому что есть и 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 
55

Как 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.

9
using System.Text.RegularExpressions; 

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

найдет первый F в InputString и заменить его R.

13

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

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"); 
4

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

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

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

-1
string abc = "AAAAX1"; 

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

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

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

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

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

Для всех, кто не возражает ссылку на Microsoft.VisualBasic, есть Replace Method:

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101" 
Смежные вопросы