Найти в Дзене

🧩 Парсинг XML с помощью регулярных выражений — безумие, которое иногда работает

Есть старое правило: «никогда не парсь XML с помощью regex». Его повторяют студенты, опытные разработчики и даже Stack Overflow с фанатичной настойчивостью. Но именно поэтому статья “You can't parse XML with regex. Let's do it anyways” так интересна — она идёт против канона и показывает, что даже в области «запрещённых приёмов» есть место рациональности. Автор блога sdomi.pl подходит к теме не как еретик, а как инженер-экспериментатор. Он признаёт: XML и HTML — слишком сложны, чтобы корректно анализировать их шаблонами. Однако в некоторых сценариях регулярки — не зло, а инструмент быстрого доступа к данным, особенно когда речь идёт о веб-скрапинге или простом поиске фрагментов в полуструктурированных логах. Автор демонстрирует минималистичный парсер на Bash, который эмулирует поведение XML-дерева с помощью стека: открывающие теги — push, закрывающие — pop. Программа анализирует поток символов, отслеживает уровень вложенности и выводит значения по запросу. 🧠 Суть подхода: Да, этот скри
Оглавление

Есть старое правило: «никогда не парсь XML с помощью regex». Его повторяют студенты, опытные разработчики и даже Stack Overflow с фанатичной настойчивостью. Но именно поэтому статья “You can't parse XML with regex. Let's do it anyways” так интересна — она идёт против канона и показывает, что даже в области «запрещённых приёмов» есть место рациональности.

Автор блога sdomi.pl подходит к теме не как еретик, а как инженер-экспериментатор. Он признаёт: XML и HTML — слишком сложны, чтобы корректно анализировать их шаблонами. Однако в некоторых сценариях регулярки — не зло, а инструмент быстрого доступа к данным, особенно когда речь идёт о веб-скрапинге или простом поиске фрагментов в полуструктурированных логах.

⚙️ Технический взгляд: как это сделано

Автор демонстрирует минималистичный парсер на Bash, который эмулирует поведение XML-дерева с помощью стека: открывающие теги — push, закрывающие — pop. Программа анализирует поток символов, отслеживает уровень вложенности и выводит значения по запросу.

🧠 Суть подхода:

  • 💾 Всё — строки. Вместо полноценной токенизации используется посимвольный разбор потока.
  • 🧱 Стек как память. Каждый тег помещается в стек и извлекается при закрытии — так формируется “виртуальное дерево”.
  • Мгновенная реакция. На каждом шаге проверяется совпадение текущего пути тегов с искомым (например, a > b > c).

Да, этот скрипт ломается на самозакрывающихся тегах и спецсимволах, но зато демонстрирует идею: даже регулярки и Bash могут работать как примитивный парсер.

💻 HTML — не XML, а «XML с сюрпризами»

Затем автор переходит к HTML. И здесь аргумент становится интересным: регулярки выигрывают там, где DOM-парсеры беспомощны из-за грязной разметки.
Веб-страницы нередко полны невалидных тегов, отсутствующих кавычек, случайных переносов строк.
И вот тут grep -P с поддержкой PCRE превращается в универсальный нож для быстрой вырезки нужных фрагментов.

Автор даже показывает кейс: извлечение списка станций с сайта железной дороги.
Вместо сложных CSS-селекторов — пара строчек в терминале:

curl (...) | grep -Poh 'scroll0.*?</div' | sed 's@<[/a-zA-Z]*>@@g;s/ //g;'

🪄 И всё — нужный список станций уже у вас.

💡 Когда regex действительно имеет смысл

Автор честно формулирует правила, когда регулярки допустимы:

🦾 В скрапинге, где важна скорость и простота, а не формальная корректность.
💾
В ограниченных окружениях, где нет места под библиотеки.
🧩
При извлечении отдельных значений, а не всей структуры.
⚙️
При наличии PCRE, ведь только там есть «ленивые» кванторы (.*?).

🧠 Личное мнение

Мне близка эта инженерная дерзость. В мире, где все повторяют «так делать нельзя», всегда найдётся тот, кто попробует — и покажет, что иногда можно.
Регулярные выражения — не замена парсерам, но инструмент, который позволяет
быстро добраться до сути.
В эпоху LLM-моделей, JSON-API и бесконечных фреймворков порой приятно вспомнить, что и старый добрый grep -P способен творить чудеса, если понимать его границы.

Regex — это не молоток, которым всё кажется гвоздём. Это скорее канцелярский нож: не для стройки, но идеален, когда нужно вскрыть нужный кусок данных. Главное — не порезаться.

🔗 Источники: