Если вы находитесь на правильном пути, должно работать следующее:
(?<=^XXX )[^\n]*(?= QQQ$)(?!.*^XXX [^\n]* QQQ$)
, в котором говорится, что совпадают все (кроме новой строки) между <start of line>XXX
и QQQ<end of line>
, если за ними не следует другая последовательность ^XXX [^\n]* QQQ$
.
Для правильной работы вышеприведенного регулярного выражения необходимо установить многострочный флаг (m
), чтобы ^
и $
соответствовали началу и концу строки, а нестрока. Вам также необходимо установить флаг «одна строка / точка все» (s
).
Если вас не волнует, что XXX
находится рядом с началом строки, а QQQ
- рядом сВ конце строки вы можете опустить якоря ^
и $
, и вам не нужно устанавливать многострочный флаг. Эта версия будет выглядеть так:
(?<=XXX )[^\n]*?(?= QQQ)(?!.*XXX [^\n]* QQQ)