Регулярное выражение, сопоставляющее HTML-теги и извлекающее текст


У меня есть такая строка теста:

<customtag>hey</customtag>

Я хочу использовать регулярное выражение для изменения текста между тегами "customtag", чтобы он выглядел следующим образом:

<customtag>hey, this is changed!</customtag>
Я знаю, что могу использовать MatchEvaluator для изменения текста, но я не уверен в правильном синтаксисе регулярных выражений. Любая помощь будет очень признательна.
5   7  

5 ответов:

Я бы не стал использовать для этого регулярное выражение, но если вы должны, это выражение должно работать: <customtag>(.+?)</customtag>

Я бы отгрыз себе ногу, прежде чем использовать регулярное выражение для разбора и изменения HTML.

Используйте XSL или DOM.


Два комментария попросили меня пояснить. Подстановка регулярных выражений работает в конкретном случае в вопросе ОП, но в целом регулярные выражения не являются хорошим решением. Регулярные выражения могут соответствоватьрегулярным языкам , то есть последовательности входных данных, которые могут быть приняты конечным автоматом. HTML может содержать вложенные теги любой произвольной глубины, так что это не обычный язык.

Какое это имеет отношение к вопросу? Использование регулярного выражения для вопроса OP в написанном виде работает, но что, если содержимое между тегами <customtag> содержит другие теги? Что делать, если в тексте встречается буквальный символ <? Прошло 11 месяцев с тех пор, как Джон Такабери задал этот вопрос, и я предполагаю, что за это время сложность его проблемы, возможно, увеличилась.

Регулярные выражения это отличные инструменты, и я использую их все время. Но использование их вместо реального парсера для ввода, который нужен, будет работать только в очень простых случаях. Практически неизбежно, что эти случаи вырастают за пределы того, что могут обрабатывать регулярные выражения. Когда это произойдет, вы будете испытывать искушение написать более сложное регулярное выражение, но они быстро становятся очень трудоемкими для разработки и отладки. Будьте готовы отказаться от решения регулярного выражения, когда требования синтаксического анализа расширять.

XSL и DOM - это две стандартные технологии, предназначенные для работы с разметкой XML или XHTML. Обе технологии позволяют анализировать структурированные файлы разметки, отслеживать вложенные теги и преобразовывать атрибуты тегов или содержимое.

Вот несколько статей о том, как использовать XSL с C#:

Вот несколько статей о том, как использовать DOM с C#:

Вот библиотека .NET, которая помогает DOM и операции XSL на HTML:

Если между двумя тегами не будет других тегов, это регулярное выражение будет немного безопаснее и эффективнее:

<customtag>[^<>]*</customtag>

Большинство людей используют HTML Agility Pack для синтаксического анализа HTML-текста. Однако я нахожу его немного прочным и сложным для моих собственных нужд. Я создаю в памяти элемент управления веб-браузером, загружаю страницу и копирую с нее текст. (смотрите пример ниже)

Здесь вы можете найти 3 простых примера:

Http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/

//This is to replace all HTML Text

var re = new RegExp("<[^>]*>", "g");

var x2 = Content.replace(re,"");

//This is to replace all &nbsp;

var x3 = x2.replace(/\u00a0/g,'');