JavaRush /Blog Java /Random-PL /Wyrażenia regularne w Javie, część 4

Wyrażenia regularne w Javie, część 4

Opublikowano w grupie Random-PL
Przedstawiamy Państwu tłumaczenie krótkiego przewodnika po wyrażeniach regularnych w Javie, napisanego przez Jeffa Friesena dla serwisu javaworld . Dla ułatwienia czytania artykuł podzieliliśmy na kilka części. Wyrażenia regularne w Javie, część 4 - 1 Wyrażenia regularne w Javie, część 1 Wyrażenia regularne w Javie, część 2 Wyrażenia regularne w Javie, część 3

Metody pracy z przechwyconymi grupami

Kod źródłowy aplikacji RegexDemozawiera wywołanie metody m.group(). Metoda group()jest jedną z kilku metod klasy Matchermają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ątek IllegalStateException.

  • Metoda String group(int group)jest podobna do poprzedniej, z tą różnicą, że zwraca znaki poprzedniego dopasowania, przechwycone przez numer grupy określony parametrem group. Należy pamiętać, że group(0)jest to równoważne group(). Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątek IndexOutOfBoundsException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

  • 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ątek IllegalArgumentException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

Poniższy przykład ilustruje użycie metod 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
Wyrażenia regularne w Javie, część 4 - 2

Metody wyznaczania pozycji meczowych

Klasa Matcherudostę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ątek IllegalStateException.

  • 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 parametrem group. Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątek IndexOutOfBoundsException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

  • Metoda int start(String name)jest podobna do poprzedniej metody, ale zwraca pozycję początkową poprzedniego dopasowania znalezionego dla grupy o nazwie name. Jeśli przechwyconej grupy namenie ma w szablonie, zgłaszany jest wyjątek IllegalArgumentException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

  • 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ątek IllegalStateException.

  • 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 parametrem group. Jeżeli szablon nie posiada przechwyconej grupy o podanym numerze, metoda zgłasza wyjątek IndexOutOfBoundsException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

  • Metoda int end(String name)jest podobna do poprzedniej metody, ale zwraca końcową pozycję poprzedniego dopasowania znalezionego dla grupy o nazwie name. Jeśli przechwyconej grupy namenie ma w szablonie, zgłaszany jest wyjątek IllegalArgumentException. Jeśli mechanizm rozpoznawania nazw nie przeprowadził jeszcze wyszukiwania lub poprzednia operacja wyszukiwania nie powiodła się, zgłaszany jest wyjątek IllegalStateException.

Poniższy przykład ilustruje dwie metody lokalizacji dopasowania, które generują początkowe/końcowe pozycje dopasowania dla grupy przechwytywania numer 2:
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 klasy PatternSyntaxExceptionopisuje błąd składniowy w wyrażeniu regularnym. Zgłasza taki wyjątek od metod compile()i matches()klasy Patterni 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ść indexjest 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.
Dodatkowo metoda dziedziczona 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 w Javie, część 4 - 3

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 komentarzy
import 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.javawejś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
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION