Разбираемся в разнице между *, +, {n,m} и добавлением ?.
Квантификаторы задают, сколько раз повторяется предыдущий элемент. * — 0 или более раз, + — 1 или более раз, ? — 0 или 1 раз. Точное число записывается как {n}, диапазон — как {n,m}. Например, \d{3} — это ровно три цифры.
По умолчанию квантификаторы жадные (greedy). То есть они стараются захватить как можно больше. Если применить <.*> к <a>b<c>, то захватится всё целиком — от первого < до последнего >.
Если добавить ? после квантификатора, совпадение становится ленивым (lazy). <.*?> захватывает как можно меньше — только <a>. Эта разница решающая, когда нужно по одному извлекать содержимое между тегами или кавычками.
Из-за жадности и лени шаблон часто ведёт себя не так, как ожидалось. Если результат захватывает слишком много, вспомните о ленивых квантификаторах или отрицательных классах символов (например, [^>]).