Найти строку и заменить между 2 строками — Регулярное выражение

#c# #regex

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

Вопрос:

У меня есть строка, в которой я хотел бы найти все слова между описанием и и заменить слова так, чтобы они были длиной всего 255 символов. Если слова меньше 255 символов, это ничего не делает, если оно больше 255 символов, это усечение слов. Я использовал регулярное выражение, только слова перехватываются за пределами определенного мной диапазона.

Я являюсь следующим регулярным выражением:

 (?<=<Name>Description</Name><Value>)(?<Text>.{0,255}).*?(?=</Value>)
 

Код на C #.

У меня есть скрипт на C #, который выполняет следующее:

             string strFile = File.ReadAllText(@"D:FINAL.xml");
            string pattern = @"(?<=<Name>Description</Name><Value>)(?<Text>.{0,255}).*?(?=</Value>)";
            string result = Regex.Replace(strFile, pattern, "${Text}");
            File.WriteAllText(@"D:FINAL.xml", result);
 

Например: https://regex101.com/r/Etfpol/5

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

1. Возможно, вы захотите использовать анализатор XML / HTML вместо синтаксического анализа XML / HTML с помощью регулярных выражений.

2. Я просто хотел заменить предложения выше 255 символов в пределах того, что я просил. Если есть альтернатива тому, что я делаю. Я дал скрипт на C #, который выполняет следующее; string strFile = File . ReadAllText(@»D:FINAL.xml «); строковый шаблон = @»(? <=<Имя> Описание </Name><Значение>)(?<Текст>.{0,255}).*?(?=</ Значение>)»; результат строки = регулярное выражение.Заменить(strFile, шаблон, «${Text}»); Файл. WriteAllText(@»D:FINAL.xml «, результат);

Ответ №1:

Это плохая идея, но ваша идея, ваш компьютер, … (в общем, вы не должны использовать регулярные выражения для «анализа» xml или html, плохие вещи могут произойти / произойдут, возможно, не сегодня, а завтра или послезавтра)

 string pattern = @"(?<=<Name>Description</Name><Value>)([^<]*)(?=</Value>)";
const int maxLength = 255
string result = Regex.Replace(strFile, pattern, x => x.Value.Length > maxLength ? x.Value.Remove(maxLength) : x.Value);
 

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

Мммм… Вы даже можете обойтись без a MatchEvaluator

 string pattern = @"(?<=<Name>Description</Name><Value>)([^<]{0,255})([^<]*)(?=</Value>)";
string result = Regex.Replace(strFile, pattern, "$1");
 

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

1. Я согласен с вашим кратким изложением, что «… не используйте регулярные выражения для анализа xml», но не согласен с предположением о гибели и мраке ; было бы лучше просто указать, что использование синтаксического анализатора XML или HTML в долгосрочной перспективе потребует меньше кода / обслуживания для большинства задач такого рода. 🙂

2. ДООООООООМ! 🙂