#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. Сейчас это не имеет значения. Но я это исправлю. Спасибо.