Использование regex в методе String.contains() в Java
Быстрый ответ
String текст = "Привет, StackOverflow!";
String регулярноеВыражение = ".*StackOverflow.*";
boolean содержит = Pattern.compile(регулярноеВыражение).matcher(текст).find();
boolean содержитРегулярныеВыражения(String строка, String паттерн) {
return Pattern.compile(паттерн).matcher(строка).find();
}
boolean результат = содержитРегулярныеВыражения(текст, регулярноеВыражение);
Эксперименты с String.matches()
Метод String.contains()
предназначен для поиска конкретных подстрок, но он не поддерживает работу с регулярными выражениями:
String безопаснаяСтрока = "123 безопасный";
boolean безопасно = безопаснаяСтрока.contains("\\d+"); // Возвращает false.
С помощью String.matches()
можно выполнять полное совпадение с шаблоном, а для частичного совпадения предусмотрен Matcher.find()
.
Обработка специальных символов
Для корректной работы с специальными символами в регулярных выражениях используйте Pattern.quote()
:
String хитраяСтрока = "10$купюра";
String защищенныйРегекс = "\\b" + Pattern.quote(хитраяСтрока) + "\\b";
boolean защищенно = содержитРегулярныеВыражения(безопаснаяСтрока, защищенныйРегекс);
Сила границ слов
Применяйте \\b
для поиска целых слов. Это позволит избежать ситуаций, когда "кошка" совпадает с "гусеница".
Урок оптимизации
Если вам нужно повторно использовать один шаблон, скомпилируйте его однажды:
Pattern шаблонNарушителя = Pattern.compile("повторныйНарушитель");
Обработка исключений
Для защиты кода от PatternSyntaxException
применяйте блоки try-catch:
try {
Pattern опасныйШаблон = Pattern.compile("some(?:dangerousPattern");
} catch (PatternSyntaxException исключение) {
// Обработка исключения.
}
Различия между find()
и matches()
Matcher.matches()
проверяет полное совпадение, а Matcher.find()
— наличие частичных совпадений.
Особенности работы с многострочными выражениями
Для обработки многострочных строк с помощью .matches
, используйте (?s)
:
String многострочныйДокумент = "Первая строка.\nВторая строка.\nТретья строка.";
boolean многострочноеСовпадение = содержитРегулярныеВыражения(многострочныйДокумент, "(?s)Первая.*Третья");
Умения "техно-ниндзя" с Pattern
и Matcher
Их можно активно использовать для решения различных задач в программировании:
Поиск паттернов
Matcher m = pattern.matcher(текст);
while (m.find()) {
System.out.println("Найдено в позиции: " + m.start());
}
Замена всех совпадений
String новыйТекст = m.replaceAll("новыйПерсонаж");
Извлечение групп
if (m.find()) {
String группа = m.group(1);
}
Визуализация
.contains()
можно представить как библиотекаря, ищущего конкретную книгу:
String книжнаяПолка = "Java, Python, Go, Rust";
boolean естьJava = книжнаяПолка.contains("Java");
Тогда как регулярные выражения – это библиотекарь-сканнер, который ищет книги по определенным критериям:
Pattern pattern = Pattern.compile("Java|Python");
Matcher matcher = pattern.matcher(книжнаяПолка);
boolean найденаИскомаяКнига = matcher.find();
.contains()
подходит для точного совпадения, а Pattern
и Matcher
предлагают больше гибкости в поиске.
Полезные материалы
- String (Java SE 11 & JDK 11) — документация Java по методу
String.contains()
. - Pattern (Java SE 11 & JDK 11) — подробная информация о классе
Pattern
. - Matcher (Java SE 11 & JDK 11) — справка по
Matcher
. - Регулярные выражения в Java – Учебник — глубокое погружение в мир regex.
- matches() против find() в регулярных выражениях Java — основные отличия между
matches()
иfind()
. - Методы класса Pattern — практическое руководство по
Pattern
. - Онлайн проверка регулярных выражений для Java — платформа для тестирования и экспериментирования с регулярными выражениями в Java.