Регулярные выражения не могут идентифицировать рекурсивные структуры . Это фундаментальное ограничение.
Возьмите JSON - это довольно простой формат, но поскольку объект может содержать другие объекты в качестве значений элементов (произвольно глубоких), синтаксис является рекурсивным и не может быть проанализирован с помощью регулярного выражения. С другой стороны, CSV может быть проанализирован с помощью регулярных выражений, поскольку он не содержит никаких рекурсивных структур.
В коротких регулярных выражениях шаблон не позволяет ссылаться на себя. Вы не можете сказать: в этот момент в синтаксисе снова соответствует весь шаблон. Иными словами, регулярные выражения совпадают только линейно, они не содержат стек, который позволил бы ему отслеживать, насколько глубоко это вложенный шаблон.
Обратите внимание, что это не имеет ничего общего с тем, насколько сложным или запутанным является формат. S-выражения действительно очень просты, но не могут быть проанализированы с помощью регулярного выражения. CSS2, с другой стороны, является довольно сложным языком, но не содержит рекурсивных структур и поэтому может быть проанализирован с помощью регулярного выражения. (Хотя это не так для CSS3 из-за выражений CSS, которые имеют рекурсивный синтаксис.)
Так что это не потому, что это некрасиво, сложно или подвержено ошибкам при разборе HTML с использованием только регулярных выражений. Дело в том, что это просто невозможно .
Если вам нужно проанализировать формат, который содержит рекурсивные структуры, вам необходимо по крайней мере дополнить использование регулярных выражений стеком, чтобы отслеживать уровень рекурсивных структур. Это обычно, как работает парсер. Регулярные выражения используются для распознавания «линейных» частей, в то время как пользовательский код вне регулярного выражения используется для отслеживания вложенных структур.
Обычно такой анализ разбивается на отдельные фазы. Токенизация - это первая фаза, где регулярные выражения используются для разделения входных данных на последовательность «токенов», таких как слова, знаки препинания, скобки и т. Д. Синтаксический анализ - это следующая фаза, на которой эти токены разбираются в иерархическую структуру, синтаксическое дерево.
Поэтому, когда вы слышите, что HTML или C # не могут быть проанализированы с помощью регулярных выражений, имейте в виду, что регулярные выражения по-прежнему являются важной частью синтаксических анализаторов. Вы просто не можете разобрать такой язык, используя только регулярные выражения и никакой вспомогательный код.