Regex, возможно, не лучшее решение для такого рода проблем - есть интерпретаторы YAML, которые вы могли бы использовать.
Если вы решили использовать регулярные выражения, есть простое решение: быть нечестным.
Locally Ungreedy
В вашем исходном регулярном выражении вы имели:
#\s*Person(\n|.)+(?=#\s*Pet)
В этом (\n|.)+
соответствует столько символов, сколько возможно допроведение взгляда Pet
.
Если вы введете ?
после +
, чтобы эта группа читала (\n|.)+
, вы получите как можно меньше символов перед проведениемlookahead.
#\s*Person(\n|.)+?(?=#\s*Pet)
Regex101 описывает +?
следующим образом:
+?
Квантор - Соответствует между один и неограниченное количество раз , как можно меньше раз, расширяясь по мере необходимости (ленивый)
Global Ungreedy
Помимо работы с локальным переключателем ungreedy , вы можете установить глобальноквантификаторы должны быть ungreedy при использовании флага U .
Обратите внимание, что это полностью меняет жадность, поэтому, если вы установите флаг U , а также используете +?
, вы снова будете сопоставлять столько раз, сколько возможно . Используйте одно решение или другое.