Я хочу заменить первое вхождение в данной строке.
Как я могу выполнить это в .NET?
Я хочу заменить первое вхождение в данной строке.
Как я могу выполнить это в .NET?
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");
Как говорится в нем, 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 для выполнения.
Взгляните на Regex.Replace.
Принимая во внимание только "первое", возможно:
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");
using System.Text.RegularExpressions;
RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);
найдет первую F
в InputString
и заменит ее на R
.
В синтаксисе С#:
int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Метод расширения С#, который сделает это:
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
И поскольку есть и 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
Предполагается, что AA
нужно заменить, только если он находится в самом начале строки:
var newString;
if(myString.StartsWith("AA"))
{
newString ="XQ" + myString.Substring(2);
}
Если вам нужно заменить первое вхождение AA
, начнется ли с него строка или нет, перейдите к решению от Marc.
Одна из перегрузок Regex.Replace
принимает значение int
для "Максимальное количество раз, когда может произойти замена". Очевидно, использование Regex.Replace
для замены обычного текста может показаться излишним, но это, безусловно, кратким:
string output = (new Regex("AA")).Replace(input, "XQ", 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;
}
Для тех, кто не возражает против ссылки на Microsoft.VisualBasic
, существует Replace
Метод:
string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
В этом примере абстрагируются подстроки (но медленнее), но, вероятно, намного быстрее, чем RegEx:
var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];
string abc = "AAAAX1";
if(abc.IndexOf("AA") == 0)
{
abc.Remove(0, 2);
abc = "XQ" + abc;
}