Из документации Java Pattern
:
Посвященные квантификаторы, которые жадно совпадают настолько, насколько могут, и не отступают, даже если это позволяетобщий матч, чтобы преуспеть.
В вашем примере <
в вашем регулярном выражении соответствует <
в строке, затем .++
соответствует всей оставшейся части строки, em>
.У вас все еще есть >
в вашем регулярном выражении, но в строке не осталось символов для соответствия (потому что .++
поглотил их всех).Таким образом, совпадение не удается.
Если бы квантификатор был жадным, то есть если бы он был .+
вместо .++
, в этот момент механизм регулярных выражений попытался бы уменьшить часть, сопоставленную на .+
, на один символ, чтобы просто em
, и попробуйте снова.На этот раз совпадение будет успешным, потому что в строке останется >
для совпадения >
в регулярном выражении.
РЕДАКТИРОВАТЬ: Ленивый квантификатор будет работать какжадный квантификатор наоборот.Вместо того, чтобы начинать с попытки сопоставить всю оставшуюся часть строки и отступать символ за символом, ленивый квантификатор начинал бы с попытки сопоставить один символ, в данном случае просто e
.Если это не позволяет полному регулярному выражению совпадать (чего не было бы здесь, потому что у вас было бы >
в регулярном выражении, пытающемся сопоставить m
в строке), ленивый квантификатор переместился бы до совпадения двухсимволы, em
.Тогда >
в регулярном выражении будет совпадать с >
в строке, и совпадение будет успешным.Однако, если это не сработает, ленивый квантификатор будет перемещаться до трех символов и т. Д.