Подтвердить что ты не робот

Regex не оператор

Есть ли оператор NOT в Regexes? Как в этой строке: "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Я хочу удалить все \([0-9a-zA-z _\.\-:]*\), но не тот, где он является годом: (2001).

То, что должно возвращать регулярное выражение, должно быть: (2001) name.

ПРИМЕЧАНИЕ: что-то вроде \((?![\d]){4}[0-9a-zA-z _\.\-:]*\) не работает для меня ((20019) как-то тоже соответствует...)

4b9b3361

Ответ 1

Нет, нет прямого не оператора. По крайней мере, не так, как вы надеетесь.

Однако вы можете использовать негативный просмотр с нулевой шириной:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

Элемент (?!...) означает "только совпадение, если текст, следующий за ним (следовательно: lookahead), не соответствует этому (отсюда: отрицательный), но на самом деле он не потребляет символы, которые он соответствует (следовательно: нулевая ширина).

На самом деле есть 4 комбинации образы с двумя осями:

  • lookbehind/lookahead: указывает, считаются ли символы до или после точки
  • положительный/отрицательный: указывает, должны ли символы совпадать или не совпадать.

Ответ 2

Не совсем, хотя обычно вы можете использовать какой-то обходной путь на одной из форм

  • [^abc], то есть символ за символом, а не a или b или c,
  • или отрицательный предпросмотр: a(?!b), который не следует a b
  • или отрицательный взгляд сзади: (?<!a)b, которому b не предшествует a