Wyrażenia regularne nie mogą zidentyfikować struktur rekurencyjnych . To jest podstawowe ograniczenie.
Weźmy JSON - jest to dość prosty format, ale ponieważ obiekt może zawierać inne obiekty jako wartości składowe (dowolnie głębokie), składnia jest rekurencyjna i nie może być analizowana przez wyrażenie regularne. Z drugiej strony CSV może być analizowany przez wyrażenia regularne, ponieważ nie zawiera żadnych struktur rekurencyjnych.
Krótko mówiąc, wyrażenia regularne nie pozwalają wzorowi odnosić się do siebie. Nie możesz powiedzieć: w tym momencie składni ponownie dopasuj cały wzorzec. Innymi słowy, wyrażenia regularne pasują tylko liniowo, nie zawiera stosu, który pozwoliłby mu śledzić, jak głęboko jest to zagnieżdżony wzór.
Pamiętaj, że nie ma to nic wspólnego z tym, jak skomplikowany lub skomplikowany jest format. Wyrażenia S są naprawdę bardzo proste, ale nie można ich analizować za pomocą wyrażenia regularnego. Z drugiej strony CSS2 jest dość złożonym językiem, ale nie zawiera struktur rekurencyjnych i dlatego można go parsować za pomocą wyrażenia regularnego. (Chociaż nie jest to prawdą w przypadku CSS3 ze względu na wyrażenia CSS, które mają składnię rekurencyjną).
Nie dzieje się tak dlatego, że jest brzydki, skomplikowany lub podatny na analizowanie kodu HTML przy użyciu tylko wyrażeń regularnych. Jest to po prostu niemożliwe .
Jeśli musisz przeanalizować format zawierający struktury rekurencyjne, musisz przynajmniej uzupełnić użycie wyrażeń regularnych stosem, aby śledzić poziom struktur rekurencyjnych. Tak zazwyczaj działa parser. Wyrażenia regularne służą do rozpoznawania części „liniowych”, a niestandardowy kod poza wyrażeniem regularnym służy do śledzenia zagnieżdżonych struktur.
Zwykle taka analiza jest podzielona na osobne fazy. Tokenizacja to pierwsza faza, w której wyrażenia regularne są używane do podziału danych wejściowych na sekwencję „tokenów”, takich jak słowa, znaki interpunkcyjne, nawiasy kwadratowe itp. Analiza jest kolejną fazą, w której tokeny te są przetwarzane w strukturę hierarchiczną, drzewo składniowe.
Kiedy więc usłyszysz, że HTML lub C # nie mogą być analizowane za pomocą wyrażeń regularnych, pamiętaj, że wyrażenia regularne nadal są kluczową częścią parserów. Po prostu nie można parsować takiego języka przy użyciu tylko wyrażeń regularnych i kodu pomocniczego.