Как мы уже писали
ранее, основная функциональность работы с регулярными выражениями представлена в Java классом
Matcher
. Рассмотрим его подробнее.
Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы
regionStart
и
regionEnd
возвращают текущие границы, а
region
устанавливает новые.
Свойство
transparentBounds
экземпляра матчера может разрешать регулярному выражению заглядывать при поиске за границы, при условии что итоговая совпавшая подстрока будет всё ещё в границах региона (
lookahead и lookbehind). А выключив свойство
anchoringBounds
можно перестать трактовать границы региона как границы строки (
^
и
$
в выражении).
Регулярные выражения используются для двух задач: поиска и замены. Поговорим о
поиске.
Метод
matches
проверяет, удовлетворяет ли выражению весь регион,
lookingAt
– хотя бы его начало. Метод
find
похож на
next
итератора – он последовательно идет по строке, и находит следующие совпадения с выражением. Эту итерацию можно сдвинуть на определенную позицию строки, передав позицию как параметр.
Matcher
реализует интерфейс
MatchResult
. Через него предоставляется информация о последнем успешном поиске (любым из перечисленных методов). Если эту информацию необходимо сохранить,
toMatchResult()
выделит её в отдельный иммутабельный объект. А если хочется обработать последовательность всех совпадений в виде стрима, поможет метод
results()
.
Интерфейс
MatchResult
предоставляет методы
group
,
start
и
end
. Они дают содержимое найденной подстроки и ее позицию в строке. Если этим методам параметром передать номер или имя
группы, то результатом будет информация не о всей подстроке, а о ее группах. Общее количество групп хранится в свойстве
groupCount
.
Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс:
hitEnd
и
requireEnd
.
hitEnd
сообщает, пришлось ли при последнем поиске дойти до конца региона.
requireEnd
подскажет, мог ли измениться результат (успех/неудача) последнего поиска, если бы в конец региона был добавлен хвост.
Метод
reset
сбрасывает всё это текущее состояние поиска. Передав в него параметр, можно заодно заменить строку, с которой работаем. Используемое регулярное выражение тоже можно заменить, методом
usePattern
, но состояние поиска при этом не сбросится.