Заменить слово, но только в определенной строке

#c# #asp.net #regex

#c# #asp.net #регулярное выражение

Вопрос:

В моем приложении я должен заменить некоторые слова из текста, который отображается более чем на одну строку.Мой текст

 Most at-home desensitizing toothpastes work by
primarily numbing the nerve and masking the pain
Traditional potassium iron-based toothpastes in the
form of potassium nitrate, potassium citrate.
 

Я хочу заменить «калий» в 3-й строке только на «».Мой код

 string text = t.Replace("potassium", "");
 

Проблема в том, что слово удаляется из всех строк.

Как заменить любое одно слово из абзаца из определенной строки?

Комментарии:

1. Вы храните свои строки в одной строке?

2. почему вы не хотите, чтобы калийный калий в четвертой строке был удален?

3. Потому что из-за вывода API только это слово помещено неправильно

4. Есть ли в строке какие-либо разрывы строк для идентификации новых строк? Если оно есть, вы можете разделить его на разрывы строк, а затем заменить конкретное слово в определенной строке.

Ответ №1:

Давайте сначала посмотрим на регулярное выражение (демонстрация здесь). Затем вы можете изменить параметры программно.

Это регулярное выражение предназначено для первого potassium в третьей строке:

 (?<=A(?:[^rn]*r?n ){2}[^rn]*?)potassium
 

Это заменяет его на bromide :

 replaced = Regex.Replace(yourString, @"(?<=A(?:[^rn]*r?n ){2}[^rn]*?)potassium", "bromide");
 

Чтобы заменить все potassium в третьей строке, мы используем G :

 (?<=A([^rn]*r?n ){2}[^rn]*?|G[^rn]*?)potassium
 

С параметрами: замена любого слова в любой строке

Чтобы заменить слово someword в строке n , создайте строку регулярного выражения программно. В регулярном выражении, которое вы должны использовать n-1 , так как это количество строк, которые мы пропускаем.

 var myRegex = new Regex(@"(?<=A(?:[^rn]*r?n ){"   (n-1)   @"}[^rn]*?)"   someword );
 

Объяснение

  • (?<=A([^rn]*r?n ){2}[^rn]*?) это большой взгляд назад, который утверждает, что мы можем найти что-то за текущей позицией (в которой мы сопоставим литерал potassium )
  • A утверждает, что мы находимся в начале строки
  • (?:[^rn]*r?n ) соответствует любому количеству символов, которые не являются символами новой строки, за которыми следует новая строка
  • {2} Квантификатор соответствует этому дважды, что приводит нас к строке 3
  • [^rn]*? лениво сопоставляет любое количество символов, не являющихся новыми строками (сейчас мы находимся в строке 3).
  • Утверждая все это, мы можем сопоставить potassium
  • в варианте 2, где мы сопоставляем все potassium в строке, |G[^rn]*? внутри lookbehind говорится, что ИЛИ то, что предшествует нам, — это позиция сразу после предыдущего сопоставления, а затем любое количество символов, отличных от перевода строки.

Комментарии:

1. Спасибо, рад, что это работает! К вашему СВЕДЕНИЮ, добавлено объяснение И вариант для замены всех экземпляров potassium в строке 3, а не только первого.

2. Небольшая демонстрация на всякий случай. 🙂 демонстрация регулярных выражений

Ответ №2:

Приведенное ниже регулярное выражение будет соответствовать строке pottassium, присутствующей только в третьей строке,

 potassium(?!s*w [.,])
 

И ваш код будет следующим,

 replaced = Regex.Replace(yourString, @"potassium(?!s*w [.,])", "");
 

ДЕМОНСТРАЦИЯ

Ответ №3:

Самый простой, но не самый лучший:

 var multiLineString = "Most at-home desensitizing toothpastes work by"   Environment.NewLine  
    "primarily numbing the nerve and masking the pain"   Environment.NewLine  
    "Traditional potassium iron-based toothpastes in the"   Environment.NewLine  
    "form of potassium nitrate, potassium citrate.";

var lines = multiLineString
    .Split(Environment.NewLine);

lines[lines.Length-1] = lines[lines.Length-1].Replace("potassium ", "");

var resultingLine = String.Join(lines, Environment.NewLine))
 

Комментарии:

1. Почему бы не сделать еще проще lines[2].Replace(...) ?

2. Да, я просто подумал, что калий был и в других строках.

3. Может быть, но он говорит, что хочет заменить только в третьей строке, а не наоборот.

4. Сейчас это не имеет значения. Но я это исправлю. Спасибо.