lamcpp
9.01.2012, 20:38:36
1.następujący wzorzec: ^a*a$
wyrazy w ktorych sprawdzam dopasowanie to: antylopa, Agnieszka i agregat
Dla wyrazu antylopa nie ma dopasowania z wzorcem! Dlaczego? Przecież przekładając wzorzec z polskiego na nasze wygląda to tak: rozpocznij od a, następnie pobierz dowolne znaki i zakończ na a, więc antylopa powinna mieścić się w dopasowaniu.
2. następujący wzorzec a*a
Teraz wszystkie wyrazy nawet agrest pasują do podanego wzorca. Dlaczego? Przecież powinna tylko antylopa
3. następujący wzorzec ^a*a
antylopa pasuje - tu jest dobrze, Agnieszka nie pasuje - tu też dobrze, ale dlaczego pasuje agrest? przecież powinny być dwie litery 'a' w wyrazie, jest tylko jedna.
Dodam, że sprawdzam wszystko na funkcji preg_match(),
wzorce zapisane są w postaci '/^a*a$/', '/a*a/' i '/^a*a/'
cycofiasz
9.01.2012, 20:42:19
jeśli chodzi o PCRE to sama gwiazdka nie wystarczy, musi być .*
Adi32
9.01.2012, 21:35:12
Mało tego, w przykładzie:
Cytat
2. następujący wzorzec a*a
Teraz wszystkie wyrazy nawet agrest pasują do podanego wzorca. Dlaczego? Przecież powinna tylko antylopa
Pasuje do wszystkiego co się zaczyna na a bo samo .* jest zachłanne. Aby zmienić tryb z zachłannego na leniwy dla konkretnego dopasowania użyj:
.*?
lamcpp
9.01.2012, 21:51:44
można zapytać co to znaczy "zachłanne"?
czy pojedyńczej gwiazdki tak jak w moich przykładach nie należy stosować? Tylko zawsze należy dodawać kropkę, bądź kropkę gwiazdkę i znak zapytania?
cycofiasz
9.01.2012, 21:59:39
Gwiazdka tyczy się znaku ją poprzedającego więc jeśli dasz a* to znaczy ze litera "a" może wystąpić zero lub więcej razy. Jeśli zamiast a dasz kropkę to ta kropka oznacza dowolny znak (oprócz łznaku nowej linii domyślnie). Jeśli wyrażenie będzie wyglądało tak '|^a.*a$|' to nie musisz się martwić o zachłanność bo zastosowane są znaki początku ^ i końca $.
Adi32
9.01.2012, 22:00:17
Skoro Cię to ciekawi to przeczytaj ten kurs:
http://gajdaw.pl/php/wyrazenia-regularne/p1.htmlJest bardzo przystępny i zrozumiały.
Zachłanne to znaczy, że dla dopasowanie a.*b nie ma sensu. (kropka odpowiada za pojedynczy znak a gwiazdka mówi że może się powtarzać od 0 do wielu) 'b' w tym przypadku też jest wchłaniane przez .* (dlatego mówimy zachłanne - gwiazdka wchłonie ile może) kiedy użyjesz .*? uzyskujesz dopasowywanie leniwe (gwiazdka wchłonie minimalną ilość znaków). Można tym jeszcze manipulować modyfikatorami.