Odwołania zwrotne w wyrażeniach regularnych Java są bardzo przydatną funkcją obsługiwaną przez silnik Java .
Aby zrozumieć, czym są linki zwrotne, musisz najpierw dowiedzieć się, czym
jest grupa . Grupa w wyrażeniach regularnych traktuje wiele znaków jako pojedynczą jednostkę. Grupy tworzy się poprzez umieszczenie znaków w nawiasach – „()”. Jedna para nawiasów to jedna grupa. Linki zwrotne są wygodne, ponieważ możemy powtarzać wzorce wyszukiwania bez ich bezpośredniego kopiowania. Wystarczy, że odniesiemy się do wcześniej zdefiniowanej grupy, używając konstrukcji takiej jak
\N , gdzie
N jest numerem grupy. Poniższe 2 przykłady pozwolą Ci poczuć wygodę korzystania z linków zwrotnych.
Przykład 1: Znajdowanie powtarzającego się wzorca
Konstrukcja formularza (\d\d\d)\1 pasuje do linii 123123, ale nie do linii 123456.String str = "ля123123ля"; Pattern p = Pattern.compile("(\\d\\d\\d)\\1"); Matcher m = p.matcher(str); System.out.println(m.groupCount()); while (m.find()) { String word = m.group(); System.out.println(word + " " + m.start() + " " + m.end()); }
Wynik:
1 123123 2 8
Uwaga tłumacza! Tutaj jako tłumacz chcę pozwolić sobie na odrobinę swobody i wstawić uwagi od siebie, bo Sam dopiero uczę się wyrażeń regularnych i mam nadzieję, że poprawią mnie przekleństwami :) jeśli to co napiszę poniżej jest błędem: 1) Metoda groupCount(
) Zwraca liczbę grup określoną we wzorcu, więc nawet jeśli wprowadzonym ciągiem znaków będzie „la123”
456 la”, który nie mieści się w szablonie, na ekranie nadal będzie wyświetlana liczba 1. 2) Metoda
find() Wyszukuje następną grupę, ale zwraca tylko wartość logiczną : prawda – znaleziono, fałsz – nie znaleziono 3) Metoda
group() Zwraca ostatni znaleziony podciąg ze wzorca. W tym przypadku 123123 4) Metoda
start() Zwraca pozycję znalezionego podciągu w ciągu źródłowym (numerowanie oczywiście zaczynając od zera) 5) Metoda
end() Zwraca pozycję w ciągu źródłowym bezpośrednio po znalezionym ciągu podciąg. Zatem wartość ta nie wskazuje na ostatni znak znalezionego podciągu w ciągu źródłowym, ale na następny po nim.
Przykład 2: Znajdowanie duplikatów słów
String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b"; Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); String phrase = "unique is not duplicate but unique, Duplicate is duplicate."; Matcher m = p.matcher(phrase); while (m.find()) { String val = m.group(); System.out.println("Найденная последовательность символов: \"" + val + "\""); System.out.println("Слово-дубликат: " + m.group(1) + "\n"); }
Wniosek:
Найденная последовательность символов: "unique is not duplicate but unique" Слово-дубликат: unique Найденная последовательность символов: "Duplicate is duplicate" Слово-дубликат: Duplicate
Należy pamiętać, że ta metoda wyszukiwania duplikatów słów (za pomocą wyrażeń regularnych) nie jest optymalna. Na przykład w powyższym przykładzie pominięto pierwsze słowo „duplikat”.
GO TO FULL VERSION