0Pricing
Java Academy · Урок

Поиск и сопоставление

matches, find, lookingAt

«Поиск и сопоставление» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Три способа применить шаблон

Matcher предоставляет три основных вида проверки:

  • matches() требует, чтобы совпадению соответствовало всё входное значение.
  • lookingAt() требует совпадения в начале.
  • find() ищет совпадение в любом месте.
import java.util.regex.Pattern;
import java.util.regex.Matcher;

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

matches: вся входная строка

matches возвращает true, только если вся строка соответствует шаблону, как если бы с обеих сторон стояли якоря.

import java.util.regex.Pattern;

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

lookingAt: совпадение в начале

lookingAt успешно выполняется, если входное значение начинается с совпадения, даже если остальная часть ему не соответствует.

import java.util.regex.Pattern;

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

find: совпадение в любом месте

find просматривает строку вперёд в поисках следующего совпадения. Он возвращает true, если начиная с текущей позиции существует хотя бы одно совпадение.

import java.util.regex.Pattern;

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

Перебор всех совпадений с помощью find

Вызов find в цикле позволяет пройти по всем совпадениям во входном значении.

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

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

Позиции совпадения: start и end

После успешного совпадения start() и end() возвращают диапазон индексов, а group() — совпавший текст.

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

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

Якоря с find

Якоря ^ и $ позволяют использовать find для проверки начала или конца. Здесь ^\d+ сопоставляется только с цифрами в самом начале.

import java.util.regex.Pattern;

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

Сброс сопоставителя

reset() возвращает сопоставитель в начало, чтобы вы могли снова просмотреть те же входные данные.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("a").matcher("aaa");
        int first = 0;
        while (m.find()) first++;
        m.reset();
        int second = 0;
        while (m.find()) second++;
        System.out.println(first + " " + second);
    }
}

Повторное использование сопоставителя для новых входных данных

reset(newInput) повторно использует тот же объект сопоставления с другой строкой, избегая выделения памяти под новый объект.

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

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

Сравнение matches и find

Выбирайте метод в зависимости от задачи: используйте matches, чтобы проверить всё значение целиком, например полный ID, а find — чтобы извлечь или найти части внутри более длинного текста.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern id = Pattern.compile("[A-Z]{2}\\d{4}");
        System.out.println(id.matcher("AB1234").matches());
        System.out.println(id.matcher("id=AB1234;").find());
    }
}

Подсчёт совпадений

Частая задача — подсчитать количество вхождений. Запустите find в цикле и увеличивайте счётчик.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("o").matcher("foo boo zoo");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

Быстрая проверка

Какой метод требует, чтобы вся входная строка соответствовала шаблону?

Повторение

Вы находили совпадения:

  • matches проверяет всё входное значение, lookingAt — начало, а find ищет совпадение в любом месте.
  • Запустите find в цикле, чтобы перебрать все совпадения и получить значения с помощью group, start и end.
  • reset возвращает сопоставитель в начало, а reset(input) повторно использует его с новым текстом.

Часто задаваемые вопросы

Урок «Поиск и сопоставление» бесплатный?

Да — полный текст урока «Поиск и сопоставление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Поиск и сопоставление»?

matches, find, lookingAt Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Поиск и сопоставление»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Компиляция шаблонов
  2. Поиск и сопоставление
  3. Захватывающие группы
  4. Замена с помощью регулярных выражений
← Назад к Java Academy