Как сделать так, чтобы регулярное выражение соответствовало всем словам, кроме одного?

1

У меня есть этот текст:

<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>

Как я могу изменить свой шаблон для работы?

  • 0
    Удалить все =\n и затем использовать регулярное выражение, которое у вас уже есть?
  • 0
    Я не могу этого сделать, потому что = \ n действует везде, кроме внутри этого тега <% = Value%>
Теги:

3 ответа

1

Простым выходом было бы удалить =\n перед передачей строки в regex:

Regex.Replace(text.Replace(@"=\n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled);

Обратите внимание, что я также заменил неохотную точку-звездочку .*? с [^<]* чтобы защитить ваше выражение от катастрофического отступления.

  • 0
    Я не могу удалить = \ n из всей строки. Может быть, я могу удалить его только из тега
1

Во-первых, вы просто не можете делать то, что хотите делать надежно, последовательно или обычно с помощью регулярных выражений. Для получения дополнительной информации о том, почему вы не должны разбирать языки разметки 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-страницы" (который, как представляется, является вашей целью).

0

Попробуй это

Regex.Replace(text, "(=\\n)", "", RegexOptions.Compiled);
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню