По умолчанию квантификаторы жадные: они захватывают как можно больше символов. Это иногда приводит к неожиданным результатам.
Представьте текст: <b>жирный</b> и шаблон <.+>. Жадный .+ захватит всё от первого < до последнего >, то есть «<b>жирный</b>» целиком, а не только «<b>».
Чтобы квантификатор брал минимум, после него ставят ? — это делает его ленивым (нежадным):
<.+?> — возьмёт минимально: «<b>», потом «</b>»
Сравните на «<b>жирный</b>»: • <.+> (жадный) → одно совпадение «<b>жирный</b>»; • <.+?> (ленивый) → два совпадения «<b>» и «</b>».
Правило: ? после * + или {} включает ленивый режим. Жадность — частый источник ошибок у новичков: шаблон «хватает» больше, чем нужно. Если совпадение оказалось слишком длинным — попробуйте сделать квантификатор ленивым или сузить класс символов (например, [^>]+ вместо .+ — «всё, кроме закрывающей скобки»).