0Pricing
Java Academy · Lekcja

Kompilowanie wzorców

Pattern.compile i Matcher

Kompilowanie wzorców to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Para Pattern i Matcher

Wyrażenia regularne w Javie znajdują się w pakiecie java.util.regex. Obiekt Pattern zawiera skompilowane wyrażenie regularne, a obiekt Matcher stosuje ten wzorzec do konkretnego tekstu wejściowego.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("abc123");
        System.out.println(m.find());
    }
}

Jednorazowa kompilacja, wielokrotne użycie

Pattern.compile jest stosunkowo kosztowne. Proszę skompilować wzorzec raz i używać go ponownie dla wielu danych wejściowych zamiast kompilować go ponownie w pętli.

import java.util.regex.Pattern;

public class Main {
    static final Pattern DIGITS = Pattern.compile("\\d+");

    public static void main(String[] args) {
        System.out.println(DIGITS.matcher("a1").find());
        System.out.println(DIGITS.matcher("bb").find());
    }
}

Escapowanie ukośników odwrotnych w Javie

Tokeny regexowe, takie jak \d, wymagają ukośnika odwrotnego, ale napisy w Javie również używają ukośnika odwrotnego do oznaczania sekwencji specjalnych. Dlatego w kodzie źródłowym należy zapisać \\d, aby oznaczyć regex \d.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern word = Pattern.compile("\\w+");
        System.out.println(word.matcher("hello").matches());
    }
}

Tworzenie obiektu Matcher

pattern.matcher(input) wiąże wzorzec z napisem wejściowym i zwraca nowy obiekt Matcher, który śledzi pozycję.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("cat");
        Matcher m = p.matcher("the cat sat");
        System.out.println(m.find());
    }
}

Obiekty Matcher przechowują stan

Obiekt Matcher przechowuje zmienny stan (bieżącą pozycję i ostatnie dopasowanie). Należy tworzyć nowy obiekt Matcher dla każdego wejścia; nie należy współdzielić jednego obiektu między wątkami.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        Matcher m = p.matcher("a1b2");
        System.out.println(m.find());
        System.out.println(m.find());
    }
}

Flaga ignorowania wielkości liter

Flagi należy przekazywać jako drugi argument metody compile. Pattern.CASE_INSENSITIVE ignoruje wielkość liter.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        System.out.println(p.matcher("I love JAVA").find());
    }
}

Łączenie flag

Flagi należy łączyć za pomocą bitowego operatora OR. W tym przypadku dodajemy MULTILINE, aby kotwice dopasowywały się na początku i końcu każdej linii.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher("apple\nApricot");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

Skrótowa metoda statyczna matches

Pattern.matches(regex, input) to pomocnicza metoda jednorazowego użycia, która kompiluje wzorzec i wykonuje test w jednym wywołaniu. Jest wygodna, ale za każdym razem ponownie kompiluje wzorzec.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        System.out.println(Pattern.matches("\\d{3}", "123"));
        System.out.println(Pattern.matches("\\d{3}", "12"));
    }
}

Dzielenie za pomocą obiektu Pattern

Skompilowany obiekt Pattern może dzielić napisy za pomocą metody split, wydajnie wykorzystując ponownie ten sam skompilowany regex.

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern comma = Pattern.compile("\\s*,\\s*");
        String[] parts = comma.split("a, b ,c,  d");
        System.out.println(Arrays.toString(parts));
    }
}

Inspekcja wzorca

pattern() zwraca oryginalny napis regexu, a flags() zwraca aktywne flagi jako wartość typu int.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
        System.out.println(p.pattern());
        System.out.println(p.flags());
    }
}

Nieprawidłowe wzorce zgłaszają wyjątki

Niepoprawny regex powoduje zgłoszenie wyjątku PatternSyntaxException podczas wywołania compile, co pozwala wcześnie wykryć błędy.

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Main {
    public static void main(String[] args) {
        try {
            Pattern.compile("[unclosed");
        } catch (PatternSyntaxException e) {
            System.out.println("Invalid regex");
        }
    }
}

Szybkie sprawdzenie

Dlaczego często używany regex należy skompilować do statycznego pola typu Pattern?

Podsumowanie

Skompilowano wzorce:

  • Pattern.compile tworzy wzorzec wielokrotnego użytku, niezmienny i bezpieczny wątkowo; metoda matcher wiąże go z wejściem.
  • Ukośniki odwrotne regexu należy zapisywać w kodzie źródłowym Javy jako \\.
  • Flagi, takie jak CASE_INSENSITIVE i MULTILINE, łączy się bitowym operatorem OR.
  • Obiekt Matcher przechowuje stan, dlatego należy tworzyć jeden obiekt dla każdego wejścia.

Często zadawane pytania

Czy lekcja „Kompilowanie wzorców” jest bezpłatna?

Tak — pełny tekst „Kompilowanie wzorców” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Kompilowanie wzorców”?

Pattern.compile i Matcher Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Kompilowanie wzorców”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kompilowanie wzorców
  2. Wyszukiwanie i dopasowywanie
  3. Grupy przechwytujące
  4. Zastępowanie za pomocą wyrażeń regularnych
← Powrót do Java Academy