С# Замена части строки начальным и конечным положениями

У меня есть строка, и я хочу заменить ее часть. Сложная часть заключается в том, что я не могу использовать 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 не нужно инициализировать и поскольку он использует более основные операции. Надеемся на эту помощь.