Задать вопрос
@estry

Как заменить элементы в строке C#?

Привет!
Есть строка
string s = "<div>Здесь нам нужно заменить некоторый текст, текст, текст</div>";


Необходимо решить четыре задачи:
1)Заменить только последнее совпадение. Например последнее "текст" заменить на "ТЕКСТ"
2)Заменить первые два совпадения. Должно получится так: "Здесь нам нужно заменить некоторый ТЕКСТ, ТЕКСТ, текст"
3)Заменить совпадения с определенными номерами. Например, заменить 1 и 3 совпадение.
4)Заменить все совпадения

Если с 4 все понятно
s = s.Replace("текст", "ТЕКСТ");
то с остальными тремя не очень...

Прошу помощи и заранее благодарен за ответы!
  • Вопрос задан
  • 1784 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
Нужно найти все места, где есть нужное слово.
string s = "<div>Здесь нам нужно заменить некоторый текст, текст, текст</div>";
var word = "текст";
var replaceTo = "ТЕКСТ";
var words = new List<int>();
int lastPos = 0;
int pos = 0;
do
{
    pos = s.IndexOf(word, lastPos);
    if (pos >= 0)
    {
        words.Add(pos);
        lastPos = pos + word.Length;
    }
}
while (pos >= 0);

А теперь уже можно сделать с ними всё что угодно - заменять хоть все, хоть по одному.
Например, замена первого слова
var result = s.Substring(0, words[0]) + replaceTo + s.Substring(words[0] + word.Length);


UPD. Можно вместо цикла найти слова с помощью регулярного выражения:
string s = "<div>Здесь нам нужно заменить некоторый текст, текст, текст</div>";
var word = "текст";
var replaceTo = "ТЕКСТ";
var words = new Regex(word).Matches(s).OfType<Match>().Select(match => match.Index).ToList();
var result = s.Substring(0, words[0]) + replaceTo + s.Substring(words[0] + word.Length);

Регекс может работать дольше, чем цикл. Зато код поиска в одну строку!
Если нужны только слова целиком (не нужно искать "текстовый", например), то алгоритм поиска в цикле усложняется (проверять символ перед и после найденного текста, является ли пробел или пунктуация или ещё что-либо). А в регексе можно написать new Regex(@"\b" + word + @"\b").Matches(s), и регулярное выражение всё сделает само.
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Вам нужен не Replace, InfexOf. Находите все вхождения искомого текста, решаете которую вам нужно заменить и клеити новую строку как: до_искомого_текста + замена + после_искомого_текста.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы