Регулярное выражение не оператор

114

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

Sonnenhut
источник
1
Существует строка как выше , и я хочу , чтобы регулярное выражение его, что результат регулярных выражений является: (2001) name.
Sonnenhut

Ответы:

114

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

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

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

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

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

  • lookbehind / lookahead: указывает , считаются ли символы до или после точки
  • положительный / отрицательный: указывает, должны ли символы совпадать или не совпадать.
Иоахим Зауэр
источник
Спасибо за то ?! это то, что я тоже предлагал, но в любом случае, если я использую, в \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)нем все еще (20019)есть
Sonnenhut
При редактировании вашего вопроса вы помещаете {4} внешний вид вперед, а в этом комментарии вы помещаете его внутрь : какой из них вы пробовали? Также: если вы хотите (20019)сопоставить, вы должны добавить \) внутреннюю часть вашего lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Иоахим Зауэр,
С регулярным выражением выше в вашем комментарии он работает. Но я этого не понимаю ... Я не понимаю, почему вы избегаете следующей части. \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Тогда есть скобка, не закрытая, не так ли?
Sonnenhut
Я избегаю закрывающей круглой скобки, )потому что хочу сопоставить буквальный символ )(так же, как вы это делаете в самом начале и в самом конце вашего регулярного выражения!). Затем после того, как я это сопоставил, я заканчиваю просмотр вперед, используя неэкранированный ).
Joachim Sauer
Понял. Меня немного смутило все эти персонажи. Спасибо.
Sonnenhut
188

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

  • [^abc], который не является символом за символом aили bили c,
  • или отрицательный взгляд вперед:, за a(?!b)которым aне следуетb
  • или отрицательный просмотр назад:, (?<!a)bкоторому bне предшествуетa
Йохан Сьёберг
источник
Да, я думаю, что отрицательный взгляд назад - это (? <! A
jankins
9
Но [^abc]должно означать не aили bили c, а не «не строка abc».
Дождь