Комментарии 7
Я сломался вот на этой строке:
Напомню, что стек — это очередь/массив, в которых операции подвергаются
push, то есть добавлению значения в конец, иpop, при котором это значение возвращается в программу.
Здесь в комментариях-описаниях неверно изложена логика. Начиная со строк 4 и 5 некорректно отражены действия и состояния стека.
# stack=()
<a> # push a; stack=(a)
<b> # push b; stack=(a b)
<c>meow</c> # push c; stack=(a b c)
<d>nya</d> # pop; push d; stack=(a b d)
</b> # pop; stack=(a b)
</a> # pop; stack=(a)
# pop; stack=()Логичнее было бы так: каждому <tag> соответствует свой push tag , и каждому </tag> соответствует свой pop. Тогда состояние стека, выражаемое stack=(...), точно соотвествовало бы действиям.
# stack=()
<a> # push a; stack=(a)
<b> # push b; stack=(a b)
<c>meow</c> # push c; pop; stack=(a b c) stack=(a b)
<d>nya</d> # push d; pop; stack=(a b d) stack=(a b)
</b> # pop; stack=(a)
</a> # pop; stack=()
Странно, успешно парсил и HTML и XML регулярками. Хорошо что не знал, что, оказывается, нельзя парсить.
Тут нужно смотреть, что вы парсили и что вы имели в виду под тем что делали это регулярными выражениями. Парсинг можно разбить на два этапа лексический и синтаксический анализ. Лексический анализ можно сделать регулярными выражениями(по крайней мере я не знаю обратного примера), говоря про не возможность парсинга html регулярными выражениями имеют ввиду синтаксический анализ. Например возьмем такой код:
<div> <div> text <\div> <\div>
С помощью регулярных выражений мы можем превратить его в например такую строку:
open_tag: div,
open_tag: div,
text: "text",
close_tag: div,
close_tag: div,
После чего эту строку мы уже превращаем в дерево, для этого нам нужно помнить уже обработанные теги.
div -> div(text)
Если мы попробуем сразу обработать регуляркой, то столкнемся с проблемой невозможности опредилить к какому div относится \div.
Я не имел ввиду создание дерева с помощью html/xml. Смотрите, как звучит заголовок "Парсить XML при помощи регулярных выражений нельзя… но давайте попробуем". О дереве в заголовке речь не идет. Распарсить, чтобы вытащить значимую информацию - можно. Пусть не за 1 этап. Получается, мы имели ввиду разные виды парсинга
У меня была задача перенести около 50 файлов XML в базу данных SQL. Наследство старой программы, которая использовала XML в качестве базы данных и элементов интерфейса. и редактировалась эта XML пользователем. Некоторые файлы были больше сотни страниц. Нужно было сохранить связи в дереве объектов тоже. От 2 до 4 уровня вложенности. Все пришлось делать не регулярками, а переносить в таблицу sql сервера и далее уже обрабатывать запросами, выдергивая нужную информацию и заполняя полдесятка таблиц.

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