С# Замена части строки начальным и конечным положениями
У меня есть строка, и я хочу заменить ее часть.
Сложная часть заключается в том, что я не могу использовать Regex.replace, потому что знаю только начальную и конечную позиции данных в строке.
Например, если строка выглядит так:
I love cats, some more stuff here, we dont know how much more
И у меня есть start=8
и end=11
. И я хочу заменить эту часть на все, что мне нужно. На этот раз скажем dogs
, поэтому новая строка будет выглядеть так:
I love dogs, some more stuff here, we dont know how much more
Как я мог это сделать?
Ответы
Ответ 1
Простейший способ:
string replaced = original.Substring(0, start) + replacementText +
original.Substring(end);
Я ожидал, что StringBuilder
будет иметь что-то, что бы это сделать, но я думаю, вам придется называть Remove
, затем Insert
.
Ответ 2
str.Substring(0, 8) + "replacement" + str.Substring(11);
Это не "элегантный", но он работает.
Ответ 3
string newString =
String.Concat(
originalString.Substring(0, start),
replacementText,
originalString.Substring(end));
ИЛИ
StringBuilder sb = new StringBuilder(originalString);
sb
.Remove(start, length)
.Insert(start, replacementText);
Ответ 4
Просто для удовольствия с LINQ:
const string S = "I love cats, some more stuff here, we dont know how much more";
const string Dogs = "dogs";
var res = S
.Take(7)
.Concat(Dogs)
.Concat(S.Where((c, i) => i > 10));
var resultString = string.Concat(res);
Ответ 5
Не изящное, но смешное решение:
string myString = "I love cats, some more stuff here, we dont know how much more";
Regex expr = new Regex("cats");
int start = 8;
int end = 11;
Match m =expr.Match(myString);
if (m.Index == start-1 && m.Length == end - (start-1))
{
Console.WriteLine(expr.Replace(myString, "dogs"));
}
Ответ 6
ReplaceAt (int index, int length, string replace)
Здесь используется метод расширения, который не использует StringBuilder или подстроку. Этот метод также позволяет заменяющей строке проходить за длину исходной строки.
//// str - the source string
//// index- the start location to replace at (0-based)
//// length - the number of characters to be removed before inserting
//// replace - the string that is replacing characters
public static string ReplaceAt(this string str, int index, int length, string replace)
{
return str.Remove(index, Math.Min(length, str.Length - index))
.Insert(index, replace);
}
При использовании этой функции, если вы хотите, чтобы вся строка замены заменяла как можно больше символов, установите длину в длину строки замены:
"0123456789".ReplaceAt(7, 5, "Salut") = "0123456Salut"
В противном случае вы можете указать количество символов, которые будут удалены:
"0123456789".ReplaceAt(2, 2, "Salut") = "01Salut456789"
Если вы указываете длину равным 0, эта функция действует так же, как функция вставки:
"0123456789".ReplaceAt(4, 0, "Salut") = "0123Salut456789"
Я думаю, что это более эффективно, поскольку класс StringBuilder не нужно инициализировать и поскольку он использует более основные операции.
Надеемся на эту помощь.