Regex не є оператором


109

Чи є в регулярних виразах оператор 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)якось теж відповідає ...)


1
Існує рядок як вище , і я хочу , щоб регулярний вираз його, що результат регулярних виразів є: (2001) name.
Sonnenhut

Відповіді:


112

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

Однак ви можете використовувати мінус-шук із нульовою шириною:

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

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

Насправді існує 4 комбінації оглядових майданчиків з 2 осями:

  • lookbehind / lookahead: вказує, чи враховуються символи до або після точки
  • позитивний / негативний: визначає, чи повинні символи збігатися чи не збігатися.

Дякую ?! то , що я пропонував теж, але в будь-якому випадку , якщо я використовую \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)до сих пір (20019)в ньому
Sonnenhut

Під час редагування вашого запитання ви поміщаєте {4} зовнішній вигляд, а в цьому коментарі - всередині : яке ви спробували? Також: якщо ви хочете (20019)збігатись, то ви повинні додати \) всередину вашого погляду:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Йоахім Зауер

Регулярний вираз у вашому коментарі працює. Але я не розумію цього ... Я не розумію, чому ви уникаєте наступної частини \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Тоді є дужка, не закрита, чи не так?
Sonnenhut,

Я уникаю закриваючих дужок, )тому що хочу зіставити буквальний символ )(так само, як це робите на самому початку та в самому кінці вашого регулярного виразу!). Потім, після того, як я зіставив це, я закінчую пошук, використовуючи нескопійований ).
Йоахім Зауер,

Зрозумів. Мене трохи бентежили всі ці персонажі. Дякую.
Sonnenhut

183

Не зовсім, хоча загалом зазвичай можна використати певний обхідний шлях для однієї з форм

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

Так, я думаю , що негативний погляд через це б - посилання (<а ?!): Regular-expressions.info/lookaround.html
jankins

8
Але [^abc]має означати не aабо, bабо c, не "не рядок abc".
Дощ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.