Регулярное выражение для замены кавычек только в тегах HTML

asp.net c# html-agility-pack regex

Вопрос

У меня есть следующая строка:

<div id="mydiv">This is a "div" with quotation marks</div>

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

<div id='mydiv'>This is a "div" with quotation marks</div>

Обратите внимание, как атрибут id в div теперь окружен апострофами?

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

Изменить: я не ищу волшебную пулю, чтобы обрабатывать каждый случай края в каждой ситуации. Мы все должны устать от использования регулярных выражений для анализа HTML, но в данном конкретном случае и для моей конкретной потребности regex - это решение ... Мне просто нужно немного помочь получить правильное выражение.

Редактировать # 2: Дженс помог найти решение для меня, но любой случайный выход на эту страницу должен долго и очень долго думать об использовании этого решения. В моем случае это работает, потому что я очень уверен в типах строк, с которыми я буду иметь дело. Я знаю опасности и риски и стараюсь, чтобы вы это делали. Если вы не уверены, знаете ли вы, это, вероятно, указывает на то, что вы не знаете и не должны использовать этот метод. Вас предупредили.

Принятый ответ

Это может быть сделано следующим образом: Я думаю , что вы хотите , чтобы заменить каждый экземпляр " , что находится между < и > с ' .

Итак, вы ищете каждый " в своем файле, загляните за < , и вперед для > . Регулярное выражение выглядит так:

(?<=\<[^<>]*)"(?=[^><]*\>)

Вы можете заменить найденные символы по своему вкусу, возможно, используя Regex.Replace .

Примечание. В то время как я нашел сообщество Stack Overflow наиболее дружелюбным и полезным, на эти вопросы Regex / HTML ответили слишком много гнева, на мой взгляд. В конце концов, этот вопрос здесь не спрашивает: «Что регулярное выражение соответствует всем допустимым HTML и ничего не соответствует».


Популярные ответы

Я вижу, что вы знаете об опасности использования Regex для выполнения подобных замен. Я добавил следующий ответ для тех, кто ищет метод, который намного более «стабилен», если вы хотите иметь решение, которое будет продолжать работать при изменении входных документов.

Используя HTML Agility Pack ( страница проекта , nuget ), это делает трюк:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему