Причина
Проблема здесь в том, что как жадный квантификатор, [^>]+
будет не только соответствовать содержимому, которое мы хотим (например, «Teeny Tiny Stevies»), но также соответствовать флагу «SOLD OUT», который мы используем для идентификации нежелательный элемент.
Таким образом, когда дело доходит до хода (?!SOLD OUT)
, он встречает конец строки (то есть $
), который на самом деле не является «SOLD OUT», то есть соответствует.
В качестве примера возьмите 'Tiny Stevies - SOLD OUT'. Процесс выглядит следующим образом:
[^>]+
: сопоставьте как можно больше [^>]
, поэтому сопоставьте всю строку «Teeny Tiny Stevies - SOLD OUT».
(?!SOLD OUT)
: сопоставить позицию, за которой не стоит "SOLD OUT", а конец строки, $
, действительно совпадает.
Решение
К сожалению, я не могу дать решение, которое может делать то, что мы хотим, только с одним регулярным выражением. Я думаю, что это может быть ограничением регулярного выражения: поскольку оно совпадает слева направо, взгляд в будущее может быть просто не его сильные стороны.
Но мы можем решить проблему с помощью двух регулярных выражений: одно для включения, другое для исключения.
>([^>]+)<
: это регулярное выражение получает предметы, хотя некоторые из них не нужны.
- , если предмет соответствует
SOLD OUT$
, выбросить его.
Возможно, есть лучшее решение. Надеюсь, это поможет вам.