Вот оно у вас
^(?:(?!car).)*book.*$
Я использовал группу без захвата, чтобы иметь одно полное совпадение с регулярным выражением, но вы можете использовать его как хотите.
Используемое вами регулярное выражение ищет в строке первое вхождение любого символа в наборе символов [?!car]
; это означает, что ?
и !
рассматриваются как отдельные символы, а не как группа без захвата, как вы, возможно, предполагали в противном случае. Следующие символы будут жадно захвачены, если не будет встречено book
. Вот почему ваш Regex не дает вам требуемого результата.