Nie ma dnia na SO, który upłynąłby bez pytania o parsowanie (X) HTML lub XML z zadawaniem wyrażeń regularnych.
Chociaż stosunkowo łatwo jest wymyślić przykłady, które demonstrują nierentowność wyrażeń regularnych dla tego zadania lub z kolekcją wyrażeń reprezentujących tę koncepcję, nadal nie mogłem znaleźć na SO formalnego wyjaśnienia, dlaczego nie jest to możliwe w przypadku laika. warunki.
Jedyne formalne wyjaśnienia, jakie do tej pory udało mi się znaleźć na tej stronie, są prawdopodobnie niezwykle dokładne, ale także dość tajemnicze dla samouka programisty:
błąd polega na tym, że HTML jest gramatyką Chomsky'ego typu 2 (gramatyka bezkontekstowa), a RegEx to gramatyka Chomsky'ego typu 3 (wyrażenie regularne)
lub:
Wyrażenia regularne mogą pasować tylko do zwykłych języków, ale HTML jest językiem bezkontekstowym.
lub:
Automat skończony (który jest strukturą danych leżącą u podstaw wyrażenia regularnego) nie ma pamięci poza stanem, w którym się znajduje, a jeśli masz dowolnie głębokie zagnieżdżenie, potrzebujesz dowolnego automatu skończonego, który koliduje z pojęciem automatu skończonego.
lub:
Lemat o pompowaniu dla zwykłych języków jest powodem, dla którego nie możesz tego zrobić.
[Aby być uczciwym: większość powyższych wyjaśnień prowadzi do stron Wikipedii, ale nie są one dużo łatwiejsze do zrozumienia niż same odpowiedzi].
Więc moje pytanie brzmi: czy ktoś mógłby dostarczyć tłumaczenie w warunkach laika formalnych wyjaśnień podanych powyżej, dlaczego nie jest możliwe użycie wyrażenia regularnego do analizowania (X) HTML / XML?
EDYCJA: Po przeczytaniu pierwszej odpowiedzi pomyślałem, że powinienem wyjaśnić: szukam „tłumaczenia”, które również krótko wyjaśnia pojęcia, które próbuje przetłumaczyć: na końcu odpowiedzi czytelnik powinien mieć przybliżony pomysł - na przykład - co oznaczają „język zwykły” i „gramatyka bezkontekstowa” ...