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)
как-то тоже соответствует...)
Ответы
Ответ 1
Нет, нет прямого не оператора. По крайней мере, не так, как вы надеетесь.
Однако вы можете использовать негативный просмотр с нулевой шириной:
\((?!2001)[0-9a-zA-z _\.\-:]*\)
Элемент (?!...)
означает "только совпадение, если текст, следующий за ним (следовательно: lookahead), не соответствует этому (отсюда: отрицательный), но на самом деле он не потребляет символы, которые он соответствует (следовательно: нулевая ширина).
На самом деле есть 4 комбинации образы с двумя осями:
- lookbehind/lookahead: указывает, считаются ли символы до или после точки
- положительный/отрицательный: указывает, должны ли символы совпадать или не совпадать.
Ответ 2
Не совсем, хотя обычно вы можете использовать какой-то обходной путь на одной из форм
-
[^abc]
, то есть символ за символом, а не a
или b
или c
, - или отрицательный предпросмотр:
a(?!b)
, который не следует a
b
- или отрицательный взгляд сзади:
(?<!a)b
, которому b
не предшествует a