Подтвердить что ты не робот

Почему такая плохая идея анализировать XML с помощью регулярного выражения?

Я просто просматривал предыдущую запись, которую я сделал, и заметил, что многие люди говорят, что я не использую Regex для синтаксического анализа xml. В этом случае xml был относительно простым, и Regex не создавал никаких проблем. Я также разбирал ряд других форматов кода, поэтому для равномерности это имело смысл. Но мне любопытно, как это может возникнуть в других случаях. Это просто вопрос "не изобретать велосипед"?

4b9b3361

Ответ 1

Настоящая проблема связана с вложенными тегами. Вложенные теги очень трудно обрабатывать с помощью регулярных выражений. Это возможно с сбалансированным соответствием, но это доступно только в .NET и, возможно, в нескольких других вариантах. Но даже при наличии сбалансированного соответствия плохой комментарий может потенциально сбросить регулярное выражение.

Например, это сложный инструмент для синтаксического анализа...

<div>
    <div id="parse-this">
        <!-- oops</div> -->
        try to get this value with regex
    </div>
</div>

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

Ответ 2

Об этом много раз говорили здесь о SO. См., Например,

Можете ли вы привести несколько примеров того, почему трудно анализировать XML и HTML с регулярным выражением?

Почему невозможно использовать регулярное выражение для анализа HTML/XML: формальное объяснение в условиях неспециалиста

Просто следуйте ссылкам в правой части экрана, чтобы получить больше ответов.

Мой вывод:

Простой, поскольку регулярное выражение не является парсером, его инструментом является поиск шаблонов.

Если вы хотите найти очень специфичный шаблон в файле (ht | x) ml, продолжайте, regex идеально подходит для этого.

Но если вы ищете что-то в каждом теге Foo, у которого могут быть атрибуты в разных порядках, которые могут быть вложенными, которые могут быть искажены (и все еще действительны), а затем использовать парсер, потому что это не соответствует шаблону.

Ответ 3

XML не является обычным языком (техническим термином), поэтому вы никогда не сможете его правильно разобрать, используя регулярное выражение. Вы можете быть успешными в 99% случаев, но тогда кто-то найдет способ написать XML, который бросает вас.

Если вы пишете какой-то экран-скребок, то вероятность успеха 99% может быть адекватной. Для большинства приложений это не так.