ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Извлечение подстроки из строки в Java: использование RegEx

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы извлечь подстроку в Java, используйте классы Pattern и Matcher. Методы matcher.find() и matcher.group() позволят выделить соответствия регулярным выражениям и извлечь их. Рассмотрим этот пример:

Java
Скопировать код
String input = "Java Sage says: The quick brown fox jumps over the lazy dog.";
String regex = "quick (\\S+) fox";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

if (matcher.find()) {
    System.out.println(matcher.group(1)); // Выведет "brown" — цвет лисы!
}

Пример иллюстрирует поиск слова между "quick" и "fox". Регулярное выражение можно изменить в соответствии с ваших требованиями для более точного извлечения подстроки.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Жадное и нежадное совпадение

Нежадные квантификаторы, такие как *?, предотвратят чрезмерное совпадение, гарантировав нахождение минимально возможного совпадения. Это одна из эффективных стратегий сопоставления.

Если требуется найти несколько совпадений, используйте цикл while в сочетании с Matcher.find() для удобства:

Java
Скопировать код
String input = "[Caution] Care with brackets [extract me]";
String regex = "\\[(.*?)\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);

List<String> matches = new ArrayList<>();
while (matcher.find()) {
    matches.add(matcher.group(1)); // В список добавятся "Caution" и "extract me".
}

matches.forEach(System.out::println); // Выводит все найденные совпадения!

Если вам приходится работать со специальными символами, например, со скобками, не забудьте о бэкслешах.

Обработка крайних случаев

Строки могут быть сложными из-за вложенных или несбалансированных скобок. В таких ситуациях простых регулярных выражений может оказаться недостаточно, и придется прибегать к более сложным методам.

Продвинутые приёмы работы с регулярными выражениями

Поиск вложенных значений

Для управления вложенными структурами может понадобиться сложный регулярный шаблон:

Java
Скопировать код
String regex = "\\[(?:\\[(.*?)\\]|[^\\[])*?\\]";

Этот шаблон позволит найти подстроки внутри вложенных скобок. Но нужно использовать его с осторожностью.

Извлечение данных со скобками или без них

Чтобы исключить скобки из совпадений, можно воспользоваться выражением:

Java
Скопировать код
String regex = "\\[([^\\]]*)\\]";

Здесь [^\\]]* означает найдение любого символа, но не закрывающей скобки.

Элегантная инкапсуляция

Оформите всю логику внутри метода, чтобы код был ясным и лёгким для поддержки:

Java
Скопировать код
public List<String> extractSubstrings(String input, String regex) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    List<String> matches = new ArrayList<>();
    
    while (matcher.find()) {
        matches.add(matcher.group(1));
    }
    
    return matches;
}

Такой подход делает код аккуратным и оптимизированным.

Замечания, подводные камни и советы

Когда вы работаете со сбалансированными скобками, будьте осторожны, и всегда проверяйте результат matcher.find(), чтобы избежать IllegalStateException.

Визуализация

Вы можете представить поиск совпадений в строке как игру в прятки:

Java-строка (Сцена для игры 🔍)Регулярное выражение (Игрок 🏃)Найденная подстрока (Попался! 🎯)
"Java Says: The quick brown fox jumps over the lazy dog.""quick (\S+) fox""brown"

Регулярное выражение поможет надежно найти интересующее вас место в строке:

Java
Скопировать код
Pattern pattern = Pattern.compile("quick (\\S+) fox");
Matcher matcher = pattern.matcher("Java Says: The quick brown fox jumps over the lazy dog.");
if (matcher.find()) {
    System.out.println("Ты попался!: " + matcher.group(1));
    // Выведет: Ты попался!: brown
}

Всё это делает Java мощным инструментом для поиска подстрок.

Полезные материалы

  1. Урок по регулярным выражениям – для глубокого изучения Regex в Java от Oracle.
  2. Учебник по регулярным выражениям – информация о квантификаторах в регулярных выражениях.
  3. Как проверить вхождение специальных символов в строку – обсуждение работы с Regex в Java.
  4. RegexPlanet – площадка для тестирования regex.
  5. regex101 – обучение и тестирование регулярных выражений на разных языках.
  6. DigitalOcean — глубокое изучение извлечения подстрок с применением Java Regex.
  7. Использование регулярных выражений в Java — руководство по шаблонам Regex от TutorialsPoint.