Próbuję zrozumieć różnicę między matches()
i find()
.
Według Javadoc (z tego, co rozumiem) matches()
przeszuka cały ciąg, nawet jeśli znajdzie to, czego szuka, i find()
zatrzyma się, gdy znajdzie to, czego szuka.
Jeśli to założenie jest prawidłowe, nie widzę, kiedy chcesz użyć matches()
zamiast find()
, chyba że chcesz policzyć liczbę znalezionych przez niego dopasowań.
Moim zdaniem klasa String powinna mieć find()
zamiast tego matches()
wbudowaną metodę.
Podsumowując:
- Czy moje założenie jest prawidłowe?
- Kiedy warto używać
matches()
zamiastfind()
?
find()
wielokrotne dzwonienie może zwrócić różne wyniki dla tego samegoMatcher
. Zobacz moją odpowiedź poniżej.Odpowiedzi:
matches
próbuje dopasować wyrażenie do całego łańcucha i niejawnie dodać^
na początku i$
na końcu wzorca, co oznacza, że nie będzie szukał podłańcucha. Stąd wynik tego kodu:123
jest podciągiem,a123b
więcfind()
metoda zwraca true.matches()
tylko „widzi”,a123b
co nie jest tym samym, co daje wynik123
fałszywy.źródło
matchers()
nie jest po prostufind()
domniemanym otoczeniem ^ i $. Pamiętaj, że dzwonienie.find()
więcej niż jeden raz może mieć inne wyniki, jeśli nie zostanie poprzedzonereset()
, amatches()
zawsze zwróci ten sam wynik. Zobacz moją odpowiedź poniżej.matches
zwraca true, jeśli cały łańcuch pasuje do podanego wzorca.find
próbuje znaleźć podciąg pasujący do wzorca.źródło
matches(p)
to tak samo,find("^" + p + "$")
jakby to było bardziej zrozumiałe."123abc123".matches("[a-z]+")
zawiedzie tak samo jak"123abc123".find("^[a-z]+$")
. Chodzi mi o to, żematches()
chodzi o pełne dopasowanie, tak jak wfind()
przypadku kotwic początkowych i końcowych.Pattern.compile("some pattern").matcher(str).matches()
jest równyPattern.compile("^some pattern$").matcher(str).find()
...("some pattern").matcher(str).matches()
jest dokładnie równy, co jest prawdziwe tylko w pierwszym wywołaniu. Zobacz moją odpowiedź poniżej....("^some pattern$").matcher(str).find()
matches()
zwróci true, tylko jeśli pełny ciąg jest dopasowany.find()
spróbuje znaleźć następne wystąpienie w podciągu pasującym do wyrażenia regularnego. Zwróć uwagę na nacisk na „następny”. Oznacza to, żefind()
wielokrotne wywołanie może nie być takie samo. Ponadto za pomocąfind()
można wywołać,start()
aby zwrócić pozycję, do której dopasowano podciąg.Wyjdzie:
Dlatego należy zachować ostrożność podczas
find()
wielokrotnego wywoływania, jeśliMatcher
obiekt nie został zresetowany, nawet jeśli wyrażenie regularne jest otoczone ciągiem znaków^
i$
dopasowuje pełny ciąg.źródło
find()
rozważy podłańcuch względem wyrażenia regularnego, gdziematches()
rozważa wyrażenie pełne.find()
zwraca true tylko, jeśli podłańcuch wyrażenia pasuje do wzorca.źródło
matches();
nie buforuje, alefind()
buforuje.find()
najpierw szuka końca łańcucha, indeksuje wynik i zwraca wartość logiczną i odpowiedni indeks.Właśnie dlatego, gdy masz taki kod
O 4: Mechanizm wyrażeń regularnych wykorzystujący strukturę wzorca odczyta cały kod (indeks do indeksu określony przez,
regex[single character]
aby znaleźć co najmniej jedno dopasowanie. Jeśli takie dopasowanie zostanie znalezione, zostanie zindeksowane, a następnie pętla zostanie wykonana na podstawie zindeksowany wynik, jeślimatches()
nie wykonałby wcześniej obliczenia takiego, który nie; Instrukcja while nigdy nie wykonałaby się, ponieważ pierwszym znakiem dopasowanego łańcucha nie jest alfabet.źródło