próbuję napisać wyrażenie regularne, które pasuje zagnieżdżonych nawiasów, npJak napisać wyrażenie rekurencyjne odpowiadające zagnieżdżonym nawiasom?
"(((text(text))))(text()()text)(casual(characters(#$%^^&&#^%#@!&**&#^*[email protected]#^**_)))"
Ciąg jak to powinno być dopasowane, bo wszystkie zagnieżdżone nawiasy są zamknięte, zamiast:
"(((text)))(text)(casualChars*#(!&#*(!))"
nie powinno lub lepiej, powinna odpowiadać co najmniej pierwszej części "(((tekst)) (tekst)".
Faktycznie, mój regexp jest:
$regex = '/(( (\() ([^[]*?) (?R)? (\)) ){0,}) /x';
Ale to nie działa prawidłowo, jak oczekuję. Jak to naprawić? Gdzie się mylę? Dzięki!
Napisałem parser dla SQL, który musiał rekursywnie to zrobić. O wiele łatwiej jest mieć funkcje rekursywne z wyrażeniem regularnym, niż próbować zrobić to rekurencyjnie z samym regex. – EdgeCase
Szczekasz złe drzewo, rozwiązanie czysto regex będzie prawdopodobnie zbyt skomplikowane i trudne do utrzymania. Lepiej byłoby rekurencyjnie analizować ciąg znaków. – GordonM
Nie ... Ok, teoretycznie można to zrobić, ale kiedy uda się to zrobić, prawdopodobnie będzie wyglądać jak gliberish. Oh, zobacz, znaleźliśmy błąd w regex! Ern ... jak to naprawić? Och, musimy też dodać wsparcie dla hamulców! Ern ... jak to dodać? Mówię ci, lepiej użyj bardziej czytelnego parsera. Fakt, że o to pytasz, pokazuje, że prawdopodobnie NIE będziesz w stanie go utrzymać. – Theraot