Metody pracy z przechwyconymi grupami
Kod źródłowy aplikacjiRegexDemo
zawiera wywołanie metody m.group()
. Metoda group()
jest jedną z kilku metod klasy Matcher
mających na celu pracę z przechwyconymi grupami:
-
Metoda
int groupCount()
zwraca liczbę przechwyconych grup we wzorcu mechanizmu rozpoznawania nazw. Liczba ta nie uwzględnia specjalnego numeru grupy przechwytywania 0, który odpowiada wzorowi jako całości. -
Metoda
String group()
zwraca znaki znalezionego wcześniej dopasowania. Aby zgłosić pomyślne wyszukiwanie pustego ciągu, ta metoda zwraca pusty ciąg. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
String group(int group)
jest podobna do poprzedniej, z tą różnicą, że zwraca znaki poprzedniego dopasowania, przechwycone przez numer grupy określony parametremgroup
. Należy pamiętać, żegroup(0)
jest to równoważnegroup()
. Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątekIndexOutOfBoundsException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
String group(String name)
zwraca znaki z poprzedniego znalezionego dopasowania, przechwycone przez grupę nazw. Jeśli przechwyconej nazwy grupy nie ma w szablonie, zgłaszany jest wyjątekIllegalArgumentException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
.
groupCount()
i group(int group)
:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
Wyniki wykonania:
3
0: abc
1: abc
2: bc
3: c
Metody wyznaczania pozycji meczowych
KlasaMatcher
udostępnia kilka metod zwracających pozycję początkową i końcową dopasowania:
-
Metoda
int start()
zwraca pozycję początkową poprzedniego znalezionego dopasowania. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
int start(int group)
jest podobna do poprzedniej, ale zwraca pozycję początkową poprzedniego dopasowania znalezionego dla grupy, której numer jest określony parametremgroup
. Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątekIndexOutOfBoundsException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
int start(String name)
jest podobna do poprzedniej metody, ale zwraca pozycję początkową poprzedniego dopasowania znalezionego dla grupy o nazwiename
. Jeśli przechwyconej grupyname
nie ma w szablonie, zgłaszany jest wyjątekIllegalArgumentException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
int end()
zwraca pozycję ostatniego znaku poprzedniego znalezionego dopasowania plus 1. Jeśli mechanizm dopasowujący nie przeprowadził jeszcze dopasowania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
int end(int group)
jest podobna do poprzedniej, ale zwraca końcową pozycję poprzedniego dopasowania znalezionego dla grupy, której numer jest określony parametremgroup
. Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątekIndexOutOfBoundsException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
. -
Metoda
int end(String name)
jest podobna do poprzedniej metody, ale zwraca końcową pozycję poprzedniego dopasowania znalezionego dla grupy o nazwiename
. Jeśli przechwyconej grupyname
nie ma w szablonie, zgłaszany jest wyjątekIllegalArgumentException
. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątekIllegalStateException
.
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
System.out.println("Найдено " + m.group(2));
System.out.println(" начинается с позиции " + m.start(2) +
" и заканчивается на позиции " + (m.end(2) - 1));
System.out.println();
}
Dane wyjściowe tego przykładu są następujące:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
Metody klasy PatternSyntaxException
Instancja klasyPatternSyntaxException
opisuje błąd składniowy w wyrażeniu regularnym. Zgłasza taki wyjątek od metod compile()
i matches()
klasy Pattern
i jest tworzony za pomocą następującego konstruktora: PatternSyntaxException(String desc, String regex, int index)
Konstruktor ten przechowuje określony opis ( desc
), wyrażenie regularne ( regex
) i pozycję, w której wystąpił błąd składniowy. Jeśli lokalizacja błędu składniowego jest nieznana, wartość index
jest ustawiana na -1
. Najprawdopodobniej nigdy nie będziesz musiał tworzyć instancji pliku PatternSyntaxException
. Jednak podczas tworzenia sformatowanego komunikatu o błędzie konieczne będzie wyodrębnienie powyższych wartości. Aby to zrobić, możesz użyć następujących metod:
- Metoda
String getDescription()
zwraca opis błędu składniowego. - Metoda
int getIndex()
zwraca pozycję, w której wystąpił błąd, lub -1, jeśli pozycja jest nieznana. - Metoda
String getPattern()
zwraca nieprawidłowe wyrażenie regularne.
String getMessage()
zwraca wielowierszowy ciąg znaków zawierający wartości zwrócone z poprzednich metod wraz z wizualnym wskazaniem, gdzie w szablonie wystąpił błąd składniowy. Co to jest błąd składniowy? Oto przykład: java RegexDemo (?itree Treehouse
W tym przypadku zapomnieliśmy określić metaznak nawiasu zamykającego ( )
) w wyrażeniu flagi zagnieżdżonej. Oto wynik tego błędu:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
Twórz przydatne aplikacje wyrażeń regularnych za pomocą interfejsu API Regex
Wyrażenia regularne umożliwiają tworzenie wydajnych aplikacji do przetwarzania tekstu. W tej sekcji pokażemy Ci dwie przydatne aplikacje, które, miejmy nadzieję, zachęcą Cię do dalszego poznawania klas i metod Regex API. Drugi dodatek przedstawia Lexan: bibliotekę kodów wielokrotnego użytku do przeprowadzania analizy leksykalnej.Wyrażenia regularne i dokumentacja
Dokumentacja jest jednym z obowiązkowych zadań podczas tworzenia profesjonalnego oprogramowania. Na szczęście wyrażenia regularne mogą pomóc w wielu aspektach tworzenia dokumentacji. Kod na Listingu 1 wyodrębnia linie zawierające jedno- i wielowierszowe komentarze w stylu C z pliku źródłowego i zapisuje je w innym pliku. Aby kod zadziałał, komentarze muszą znajdować się w tej samej linii. Listing 1. Pobieranie komentarzyimport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class ExtCmnt
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("Способ применения: java ExtCmnt infile outfile");
return;
}
Pattern p;
try
{
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Jakая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
}
catch (PatternSyntaxException pse)
{
System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
System.err.printf("Описание ошибки: %s%n", pse.getDescription());
System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
return;
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
Matcher m = p.matcher("");
String line;
while ((line = br.readLine()) != null)
{
m.reset(line);
if (m.matches()) /* Должна соответствовать вся строка */
{
bw.write(line);
bw.newLine();
}
}
}
catch (IOException ioe)
{
System.err.println(ioe.getMessage());
return;
}
}
}
Metoda main()
z Listingu 1 najpierw sprawdza poprawność składni wiersza poleceń, a następnie kompiluje wyrażenie regularne zaprojektowane do wykrywania jedno- i wielowierszowych komentarzy w obiekcie klasy Pattern
. Jeśli nie zostanie zgłoszony żaden wyjątek PatternSyntaxException
, metoda main()
otwiera plik źródłowy, tworzy plik docelowy, uzyskuje element dopasowujący pasujący do każdej linii odczytanej ze wzorca, a następnie odczytuje plik źródłowy linia po linii. Do każdej linii dopasowywany jest wzorzec komentarza. Jeśli się powiedzie, metoda main()
zapisuje ciąg znaków (po którym następuje znak nowej linii) do pliku docelowego (logikę wejścia/wyjścia pliku omówimy w przyszłym samouczku Java 101). Skompiluj Listing 1 w następujący sposób: javac ExtCmnt.java
Uruchom aplikację z plikiem ExtCmnt.java
wejściowym: java ExtCmnt ExtCmnt.java out
Powinieneś otrzymać następujące wyniki w pliku:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Jakая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
We wzorcu string .*/\\*.*\\*/|.*//.*$
metaznak potoku |
działa jak logiczny operator OR, wskazując, że funkcja dopasowująca powinna użyć lewego operandu danej konstrukcji wyrażenia regularnego, aby znaleźć dopasowanie w tekście funkcji dopasowującego. Jeśli nie ma żadnych dopasowań, funkcja dopasowująca używa prawego operandu z danej konstrukcji wyrażenia regularnego do kolejnej próby wyszukiwania (metaznaki w nawiasach w przechwyconej grupie również tworzą operator logiczny). Wyrażenia regularne w Javie, część 5
GO TO FULL VERSION