ja parsowania (species) Nazwy postaci:wyrażenie regularne przechodzi w nieskończonej pętli
Parus Ater
H. sapiens
T. rex
Tyr. rex
które normalnie mają dwie kadencje (dwumianowego), ale czasami mają 3 lub więcej.
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
pisałem
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
który pracował przez większość czasu, ale od czasu do czasu poszedł do nieskończonej pętli. Zajęło to trochę czasu, aby wyśledzić, że to było w dopasowywaniu regex i wtedy zdałem sobie sprawę, że to literówka i powinno Pisałem
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
która wykonuje poprawnie.
Moje pytania są następujące:
- dlaczego ta pętla się stało?
- Czy istnieje sposób, w jaki mogę sprawdzić podobne błędy regex przed uruchomieniem programu? W przeciwnym razie może być trudne przechwycenie ich przed dystrybucją prgram i spowodowanie problemów.
[Uwaga: nie potrzebuję bardziej ogólnego wyrażenia dla gatunków - istnieje formalna ponad 100 liniowa specyfikacja dla nazw gatunków - to był tylko filtr początkowy].
UWAGA: Problem pojawił się, ponieważ chociaż większość nazw została wyodrębniona dokładnie na 2 lub czasami 3/4 terminów (tak, jak pisano kursywą), było kilka fałszywych alarmów (np. "Homo sapiens lives in big cities like London"
), a mecz zakończył się niepowodzeniem na "L". ]
UWAGA: Podczas debugowania tego stwierdziłem, że regex często kończył się, ale był bardzo powolny (np. W krótszych ciągach docelowych). Jest cenne, że znalazłem ten błąd przez przypadek patologiczny. Nauczyłem się ważnej lekcji!
Nie można po prostu przewidzieć, czy regex wejdzie w nieskończoną pętlę. Jeśli masz zbyt złożone wyrażenia regularne ("100+ wyrażeń regularnych"), może to być (mówię "może"), że potrzebujesz zamiast tego jakiegoś analizatora składni. –
Myślę, że powinieneś napisać '(\ s + [az] +) +' zamiast '\ s + [az] [az] + (\ s + [az] +) *' – shift66
@ shift66 Napisałem '\ s + [az] [az] + ", ponieważ chciałem się upewnić, że drugi termin zawiera co najmniej 2 znaki. Nie obchodzi mnie trzeci i później. –