Регулярное выражение не оператор - PullRequest
62 голосов
/ 06 сентября 2011

Есть ли в регулярных выражениях оператор NOT?Как в этой строке: "(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) как-то тоже совпадает ...)

Ответы [ 2 ]

118 голосов
/ 06 сентября 2011

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

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

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

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

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

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

На самом деле существует 4 комбинации lookarounds с 2 осями:

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