Рассмотрите возможность использования этого шаблона:
^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$
Причиной сбоя текущего регулярного выражения является то, что начальный (.*)?start
на самом деле потребляет start foo again
, следовательно, обходит отрицательную закаленную точку, которая проверяет, что foo
и boo
не появляются между ними.Мой подход использует в начале только , если слово не start
.Это позволяет вашей логике работать должным образом, и мы можем утверждать, что ни foo
, ни boo
не появляются между самым первым start
и текстом end test
.
Обратите внимание, что я добавил границы слов внесколько мест, а также сделали группы не захватившими, предполагая, что вы не хотите захватывать что-либо.
Демо