Я просто просматривал предыдущую запись, которую я сделал, и заметил, что многие люди говорят, что я не использую Regex для синтаксического анализа xml. В этом случае xml был относительно простым, и Regex не создавал никаких проблем. Я также разбирал ряд других форматов кода, поэтому для равномерности это имело смысл. Но мне любопытно, как это может возникнуть в других случаях. Это просто вопрос "не изобретать велосипед"?
Почему такая плохая идея анализировать XML с помощью регулярного выражения?
Ответ 1
Настоящая проблема связана с вложенными тегами. Вложенные теги очень трудно обрабатывать с помощью регулярных выражений. Это возможно с сбалансированным соответствием, но это доступно только в .NET и, возможно, в нескольких других вариантах. Но даже при наличии сбалансированного соответствия плохой комментарий может потенциально сбросить регулярное выражение.
Например, это сложный инструмент для синтаксического анализа...
<div>
<div id="parse-this">
<!-- oops</div> -->
try to get this value with regex
</div>
</div>
Вы могли бы проводить такие красные случаи, как это в течение нескольких часов с регулярным выражением, и, возможно, найти решение. Но на самом деле нет смысла, когда есть специализированные XML, XHTML и HTML-парсеры, которые делают работу более надежно и эффективно.
Ответ 2
Об этом много раз говорили здесь о SO. См., Например,
Просто следуйте ссылкам в правой части экрана, чтобы получить больше ответов.
Мой вывод:
Простой, поскольку регулярное выражение не является парсером, его инструментом является поиск шаблонов.
Если вы хотите найти очень специфичный шаблон в файле (ht | x) ml, продолжайте, regex идеально подходит для этого.
Но если вы ищете что-то в каждом теге Foo, у которого могут быть атрибуты в разных порядках, которые могут быть вложенными, которые могут быть искажены (и все еще действительны), а затем использовать парсер, потому что это не соответствует шаблону.
Ответ 3
XML не является обычным языком (техническим термином), поэтому вы никогда не сможете его правильно разобрать, используя регулярное выражение. Вы можете быть успешными в 99% случаев, но тогда кто-то найдет способ написать XML, который бросает вас.
Если вы пишете какой-то экран-скребок, то вероятность успеха 99% может быть адекватной. Для большинства приложений это не так.