Разберу всё по порядку:
. - Точка. Совпадает с любым символом, кроме перевода строки.
+ - Квантификатор совпадений. Обозначает одно или более совпадений с предшествующим квантификатору символом или шаблоном.
? - Квантификатор совпадений. Обозначает ноль или одно совпадение с предшествующим квантификатору символом или шаблоном.
(...) - Определяет вложенный шаблон, который может использоваться для группировки некоторых элементов.
В данном примере квантификатор ? работает как "таблетка от жадности". Устанавливая его после квантификаторов + или * будет ставиться минимальное совпадение по шаблону.
Также для отключение жадности есть модификатор U устанавливая его в регулярном выражении "жадные" квантификаторы становятся "ленивыми", а "жадность" включается квантификатором ?
Тоесть приведённое мной выше регулярное выражение может быть записано так:
|