C # Замена части строки начальной и конечной позицией - PullRequest
11 голосов
/ 27 июня 2011

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

Как я мог это сделать?

Ответы [ 6 ]

21 голосов
/ 27 июня 2011

Простейший способ:

string replaced = original.Substring(0, start) + replacementText + 
                  original.Substring(end);

Я ожидал, что StringBuilder найдет что-то, что могло бы сделать это, но я думаю, что вам нужно будет позвонить Remove, затем Insert.

6 голосов
/ 27 июня 2011
str.Substring(0, 8) + "replacement" + str.Substring(11);

Это не "элегантно", но работает.

1 голос
/ 10 сентября 2017

ReplaceAt (индекс int, длина int, замена строки)

Вот метод расширения, который не использует StringBuilder или Substring. Этот метод также позволяет замещающей строке выходить за пределы длины исходной строки.

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

0 голосов
/ 27 июня 2011

Не элегантное, но забавное решение:

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")); 
        }
0 голосов
/ 27 июня 2011

Просто для удовольствия с 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);
0 голосов
/ 27 июня 2011
string newString = 
 String.Concat(
        originalString.Substring(0, start),
        replacementText, 
        originalString.Substring(end));

OR

StringBuilder sb = new StringBuilder(originalString);
sb
  .Remove(start, length)
  .Insert(start, replacementText);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...