В своем отрицательном прогнозном утверждении измените +
на *
; в противном случае вы не препятствуете завершению матча непосредственно перед /
, вы только предотвращаете его завершение прямо перед словом, за которым следует /
. Кроме того, удалите ^
из вашего отрицательного утверждения; это означает «начало строки», поэтому никогда не будет совпадать в этом контексте. Что оставляет:
[A-Z0-9]+/([A-Z0-9 ]+)(?![A-Z0-9]*/)
(я также отбросил нотацию (?:...)
, поскольку она не имела никакого эффекта в контексте, где она появилась.)
Тем не менее, несколько более простой для чтения подход может быть следующим:
[A-Z0-9]+/([A-Z0-9 ]+)( |$)
, который требует, чтобы за значением следовал либо пробел (который проглатывается), либо конец строки. Поскольку за ключами следует /
, они будут игнорироваться.