У меня есть этот текст:
<tag>Value<tag>
и я хочу преобразовать его в
<%= Value %>
Я смог это сделать, используя:
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);
Однако текст может содержать это слово "=\n" в любом месте текста. например:
<tag=\n>Value<tag>
<tag>Value<tag=\n>
<tag>Value=\n<tag>
<tag>=\nValue<tag>
<tag>Va=\nlue<tag>
<ta=\ng>Value<tag>
Как я могу изменить свой шаблон для работы?
Простым выходом было бы удалить =\n
перед передачей строки в regex:
Regex.Replace(text.Replace(@"=\n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled);
Обратите внимание, что я также заменил неохотную точку-звездочку .*?
с [^<]*
чтобы защитить ваше выражение от катастрофического отступления.
Во-первых, вы просто не можете делать то, что хотите делать надежно, последовательно или обычно с помощью регулярных выражений. Для получения дополнительной информации о том, почему вы не должны разбирать языки разметки SGML с регулярными выражениями, см. @Bobince окончательный ответ на разбор (X) HTML
Это из-за этого, здесь регулярное выражение, которое вам нужно использовать. Зачем? Поскольку нет оператора регулярных выражений для "interpersed-between" (такой оператор не был бы доступен на обычном языке, насколько мне известно, поэтому вам понадобится совершенно другая модель для записи такого распознавателя строк).
<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>(?<value>([^<]*))<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>
Вам придется немного изменить шаблон замены:
<%= ${value} %>
Если вам нужно удалить "=\n" (похоже, что вы пытаетесь обработать экранированный текст, который вы также никогда не должны делать: какие бы необычные алгоритмы вы не выполняли, unescape текст, обрабатывать его и снова убегать, если необходимо), вы не сможете сделать это в том же регулярном выражении. На самом деле вам, вероятно, потребуется пройти два прохода через текст, один раз, чтобы получить каждое значение для саниции в процедурный код, затем один раз, чтобы повторно вставить значения в соответствующие места.
TL; DR: используйте реальный синтаксический анализатор XML, если вы хотите "преобразовать XML в ASP-страницы" (который, как представляется, является вашей целью).
Попробуй это
Regex.Replace(text, "(=\\n)", "", RegexOptions.Compiled);
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);
=\n
и затем использовать регулярное выражение, которое у вас уже есть?