В Java, регулярные выражения (Regular Expressions или сокращённо Regex) — это API для определения шаблонов строк, которые можно использовать для поиска, обработки и редактирования строк. Проверка корректности email и паролей — одни из основных областей применения Regex для задания ограничений. Регулярные выражения в Java предоставляются в пакете java.util.regex.
Пример:
// Java-программа, демонстрирующая работу метода matches() из класса Pattern
import java.util.regex.Pattern;
class GFG {
public static void main(String args[]){
// Следующая строка выведет "true", потому что вся
// строка "geeksforgeeks" соответствует шаблону
// "geeksforge*ks"
System.out.println(Pattern.matches(
"geeksforge*ks","geeksforgeeks"));
// Следующая строка выведет "false", потому что вся
// строка "geeksfor" не соответствует шаблону "g*geeks*"
System.out.println(Pattern.matches(
"g*geeks*","geeksfor"));
}
}
Вывод:
true
false
Классы и интерфейсы Regex
Пакет java.util.regex включает в себя 3 класса и 1 интерфейс. Основные из них представлены в таблице ниже:
Класс/Интерфейс | Описание |
---|---|
Pattern Class | Используется для определения шаблонов |
Matcher Class | Выполняет операции сопоставления текста с шаблонами |
PatternSyntaxException Class | Сигнализирует об ошибках синтаксиса в регулярном выражении |
MatchResult Interface | Представляет результат операции сопоставления |
Подробнее структура и взаимосвязи этих классов можно увидеть на соответствующей диаграмме (изображение в оригинальной статье).
Класс Pattern
Класс Pattern представляет собой компиляцию регулярного выражения (pattern), позволяющую задавать различные шаблоны поиска. Он не имеет публичных конструкторов. Объект Pattern создаётся вызовом статического метода compile()
, который принимает регулярное выражение в качестве аргумента и возвращает скомпилированный шаблон.
Методы класса Pattern:
Метод | Описание |
---|---|
compile(String regex) | Компилирует переданное регулярное выражение в объект Pattern. |
compile(String regex, int flags) | Компилирует регулярное выражение с учётом заданных флагов. |
flags() | Возвращает флаги, применённые к данному шаблону. |
matcher(CharSequence input) | Создаёт объект Matcher для сопоставления входной последовательности с шаблоном. |
matches(String regex, CharSequence input) | Компилирует регулярное выражение и пытается определить, соответствует ли входная строка шаблону. |
pattern() | Возвращает исходное регулярное выражение, из которого скомпилирован Pattern. |
quote(String s) | Возвращает строку, представляющую буквальный шаблон для заданной строки. |
split(CharSequence input) | Разбивает входную последовательность по совпадениям с шаблоном. |
split(CharSequence input, int limit) | Разбивает входную последовательность с ограничением на количество разбиений. |
toString() | Возвращает строковое представление шаблона. |
Пример использования Pattern:
// Java-программа, демонстрирующая работу метода matches() класса Pattern
import java.util.regex.Pattern;
class GFG {
public static void main(String args[]){
// Выводит "true" - вся строка "geeksforgeeks" соответствует шаблону "geeks.*"
System.out.println(Pattern.matches(
"geeks.*", "geeksforgeeks"));
// Выводит "false" - строка "geeks12s" не соответствует шаблону "geeks[0-9]+"
System.out.println(Pattern.matches(
"geeks[0-9]+", "geeks12s"));
}
}
Вывод:
true
false
Класс Matcher
Объект Matcher используется для выполнения операций сопоставления с входной строкой, применяя ранее скомпилированные шаблоны Pattern. Класс не имеет публичных конструкторов. Экземпляр Matcher создаётся вызовом метода matcher()
у объекта Pattern.
Методы Matcher:
Метод | Описание |
---|---|
find() | Ищет первое или последующее вхождение шаблона в тексте. |
find(int start) | Начинает поиск с заданного индекса в тексте. |
start() | Возвращает индекс начала найденного соответствия. |
end() | Возвращает индекс символа, следующего за последним символом найденного соответствия. |
groupCount() | Возвращает количество подгрупп, найденных в сопоставлении. |
group() | Возвращает найденное соответствие. |
matches() | Проверяет, соответствует ли вся входная строка шаблону. |
Обратите внимание:
МетодPattern.matches()
проверяет, соответствует ли весь текст шаблону целиком. Другие методы (например,find()
) предназначены для поиска нескольких вхождений шаблонов в тексте.
Рассмотрим примеры программ с использованием compile(), find(), start(), end() и split() для лучшего понимания класса Matcher.
Пример 1: Поиск шаблона в строке
// Java-программа, демонстрирующая работу поиска строк с помощью Matcher
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class GFG {
public static void main(String args[])
{
// Создаём шаблон для поиска
Pattern p = Pattern.compile("geeks");
// Ищем шаблон в строке "geeksforgeeks.org"
Matcher m = p.matcher("geeksforgeeks.org");
// Используем find() для нахождения всех вхождений
while (m.find())
// Выводим начальный и конечный индексы найденного шаблона в строке
System.out.println("Pattern found from " + m.start() + " to " + (m.end() - 1));
}
}
Вывод:
Pattern found from 0 to 4
Pattern found from 8 to 12
Классы символов Regex (Character Classes)
Класс символов | Описание |
---|---|
[xyz] | Символы x, y или z |
[^xyz] | Любые символы, кроме x, y или z |
[a-zA-Z] | Символы из диапазона a–z или A–Z |
[a-f[m-t]] | Объединение диапазонов a–f и m–t |
[a-z&&p-y] | Пересечение диапазонов (только символы, присутствующие в обоих) |
[a-z&&[^bc]] | Диапазон a–z за исключением b и c |
[a-z&&[^m-p]] | Диапазон a–z за исключением диапазона m–p |
Пример:
// Java-программа для проверки Character Classes в Regex
import java.io.*;
import java.util.regex.*;
class GFG {
public static void main(String[] args)
{
// Проверка, что строка — одиночный символ от a до z
System.out.println(Pattern.matches("[a-z]", "g"));
// Проверка, что строка — одиночный символ из диапазона a–z или A–Z
System.out.println(Pattern.matches("[a-zA-Z]", "Gfg")); // Обратите внимание, что здесь строка состоит из трех символов, а шаблон рассчитан на один символ
}
}
Вывод:
true
false
Метасимволы Regex
Регулярное выражение | Описание |
---|---|
X? | X встречается один раз или не встречается |
X+ | X встречается один или более раз |
X* | X встречается ноль или более раз |
X{n} | X встречается ровно n раз |
X{n,} | X встречается n или более раз |
X{n,m} | X встречается от n до m раз (включительно) |
Пример:
// Java-программа для проверки метасимволов Regex
import java.io.*;
import java.util.regex.*;
class GFG {
public static void main(String[] args)
{
// Проверяем, что строка соответствует заданному шаблону
System.out.println(Pattern.matches("[b-z]?", "a"));
// Проверка, что строка состоит из символов в диапазоне a–z или A–Z
System.out.println(Pattern.matches("[a-zA-Z]+", "GfgTestCase"));
// Проверка, что символ НЕ в диапазоне a–z (или отсутствует)
System.out.println(Pattern.matches("[^a-z]?", "g"));
// Проверка, что строка состоит только из символов g, e, k или s
System.out.println(Pattern.matches("[geks]*", "geeksgeeks"));
}
}
Вывод:
false
true
false
true
Пример поиска с помощью Java Regex Finder
Regex | Описание |
---|---|
. | Любой символ |
\d | Любая цифра [0-9] |
\D | Любой нецифровой символ [^0-9] |
\s | Пробельный символ (таб, перевод строки и др.) |
\S | Не пробельный символ [^\s] |
\w | Символ слова (буква, цифра, _) |
\W | Не является символом слова [^\w] |
\b | Граница слова |
\B | Не граница слова |
Пример программы:
// Java-программа, демонстрирующая использование Java Regex Finder
import java.io.*;
import java.util.regex.*;
class GFG {
public static void main(String[] args)
{
// Проверка, что строка состоит только из цифр
System.out.println(Pattern.matches("\\d+", "1234"));
// Проверка, что строка состоит только из нецифровых символов
System.out.println(Pattern.matches("\\D+", "1234"));
// Проверка, что строка состоит только из нецифровых символов (буквы и др.)
System.out.println(Pattern.matches("\\D+", "Gfg"));
// Проверка, что строка состоит из непробельных символов
System.out.println(Pattern.matches("\\S+", "gfg"));
}
}
Вывод:
true
false
true
true
Заключение
Итоговые ключевые моменты из статьи:
- Объект Pattern создаётся вызовом статического метода
Pattern.compile()
, конструктора у класса нет. - Экземпляр Matcher создаётся через вызов метода
matcher()
у объекта Pattern. - Статический метод
Pattern.matches()
проверяет, соответствует ли вся входная строка заданному шаблону. - Метод
find()
используется для поиска нескольких вхождений шаблона в тексте. - Метод
split()
позволяет разбивать строку на части по шаблону-разделителю.
🔑 Ключевые моменты:
-
В Java регулярные выражения реализованы через пакет
java.util.regex
, предоставляющий основные классы Pattern и Matcher. -
Pattern используется для компиляции шаблона, Matcher — для поиска и сопоставления в тексте.
-
Regex позволяет легко проверять строки на соответствие сложным правилам (например, валидация email, пароля).
-
Методы
find()
иmatches()
служат разным целям: поиск вхождений и проверка полного соответствия. - В регулярных выражениях важны классы символов и метасимволы для создания точных и гибких паттернов.