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





Я бы откусил себе ногу, прежде чем использовать регулярное выражение для синтаксического анализа и изменения HTML.
В двух комментариях меня попросили уточнить. Подстановка регулярного выражения работает в конкретном случае в вопросе OP, но в целом регулярные выражения не являются хорошим решением. Регулярные выражения могут соответствовать обычные языки, то есть последовательности ввода, которая может быть принята конечным автоматом. HTML может содержать вложенные теги любой произвольной глубины, поэтому это не обычный язык.
При чем здесь вопрос? Использование регулярного выражения для вопроса OP в том виде, в котором он написан, работает, но что, если содержимое между тегами <customtag> содержит другие теги? Что делать, если в тексте встречается буквальный символ <? Прошло 11 месяцев с тех пор, как Джон Тэкабери задал этот вопрос, и я предполагаю, что за это время сложность его проблемы, возможно, увеличилась.
Регулярные выражения - отличные инструменты, и я использую их постоянно. Но использование их вместо настоящего парсера для ввода, который нужен, будет работать только в очень простых случаях. Практически неизбежно, что эти случаи выходят за рамки того, что могут обрабатывать регулярные выражения. Когда это произойдет, у вас возникнет соблазн написать более сложное регулярное выражение, но его разработка и отладка быстро станут очень трудоемкими. Будьте готовы отказаться от решения для регулярных выражений, когда требования к синтаксическому анализу увеличатся.
XSL и DOM - это две стандартные технологии, предназначенные для работы с разметкой XML или XHTML. Обе технологии умеют анализировать файлы структурированной разметки, отслеживать вложенные теги и позволяют преобразовывать атрибуты или содержимое тегов.
Вот пара статей о том, как использовать XSL с C#:
Вот пара статей о том, как использовать DOM с C#:
Вот библиотека .NET, которая помогает выполнять операции DOM и XSL с HTML:
Ну, я иногда использую их в контролируемых средах с машинным кодом, который, как известно, согласован, для быстрой работы ...
Тогда почему бы вам не показать нам, как это сделать с помощью XSL или DOM на C#? Делать громкие заявления легко. Посмотрим на реальный код. Регулярные выражения не подходят для синтаксического анализа обычного HTML, но они идеально подходят для выполнения определенных действий с конкретным кодом HTML.
Признаюсь, вы меня рассмешили, но давайте объясним или дадим ссылку на хорошее объяснение того, почему вы предпочли бы откусить себе ногу. Думаю, некоторым программистам действительно очевидно, почему, а может и не новичку?
Я бы тоже не стал использовать для этого регулярное выражение, но если вам нужно, это выражение должно работать:
<customtag>(.+?)</customtag>
Спасибо, это сработало отлично. Обычно я бы не использовал RegEx для такого анализа HTML, но этот HTML-код взят из внутренней системы и правильно сформирован.
В качестве предупреждения другим: он не будет работать с правильно сформированным синтаксисом | <customtag> <customtag> Some text </customtag> | </customtag> - область между символами вертикальной черты совпадает, поэтому второй <customtag> будет удален, оставив плохо сформированный XML.
Да, и именно поэтому вам не следует пытаться анализировать xml с помощью регулярного выражения. Вы можете ограничить то, что может находиться между тегами, и просто разрешить буквы, цифры и пробелы, и это будет работать немного лучше. Но тогда он ограничен определенным доменом, поэтому что-то вроде этого: <customtag> ([a-zA-Z0-9]) + </customtag>
Или просто <customtag> ([^ <] +) </customtag>. Но да, HTML не является регулярным языком, поэтому в более общем случае вы не можете использовать регулярные выражения для его сопоставления. Это та же проблема, что и при использовании регулярного выражения для соответствия сбалансированным круглым скобкам.
Если между двумя тегами не будет других тегов, это регулярное выражение будет немного безопаснее и эффективнее:
<customtag>[^<>]*</customtag>
//This is to replace all HTML Text
var re = new RegExp("<[^>]*>", "g");
var x2 = Content.replace(re,"");
//This is to replace all
var x3 = x2.replace(/\u00a0/g,'');
Большинство людей используют HTML Agility Pack для синтаксического анализа текста HTML. Тем не менее, я считаю его немного надежным и сложным для моих нужд. Я создаю в памяти элемент управления веб-браузера, загружаю страницу и копирую из нее текст. (см. пример ниже)
Здесь вы можете найти 3 простых примера:
http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/
лучший ответ к этому вопросу на сегодняшний день.