2016-12-15 4 views
0

Я просмотрел несколько сообщений об этом, и у меня все еще возникают проблемы.Отрицание запроса регулярного выражения

Я пытаюсь написать запрос регулярного выражения, который находит имена кодов S3, которые делают не, следуя схеме именования, которую мы хотим. Схема мы хотим следующим образом:

тест-ковш бревна ** - нас-восток-1 **

жирным шрифтом часть необязательно. Значение, следующие два являются допустимыми именами ковшовые:

  1. тест-ковш бревна
  2. тест-ковш-журналы-нас-восток-1

Теперь, что я хочу сделать, это отрицать это. Поэтому я хочу поймать все ведра, которые не следуют приведенной выше схеме. Я успешно сформировал запрос, который будет соответствовать схеме именования, но у меня возникают проблемы с формированием того, что отрицает его. Регулярное выражение ниже:

^(.*-bucket-logs)(-[a-z]{2}-[a-z]{4,}-\d)?$

Таким образом, некоторые более действительные имена ковшовые:

  1. пример-ковш-журналы-ар-северо-восток-1
  2. что-то ведро-журналы-ес-центральные -1

Недействительные имена ковшовые (мы хотим, чтобы соответствовать этим):

  1. Iscrewedthepooch
  2. тест-ковш-журналы-нас-Е.Е.
  3. ведро-журналы-нас-восток-1

Спасибо за помощь.

+0

Отрицание регулярного выражения обычно затруднено. Либо используйте отрицательный просмотр, либо выполняйте отрицание в коде, который выполняет совпадение - удалите элементы, которые соответствуют, а не сохраняют их. – Barmar

+0

Я думаю, что отрицание результата в коде - это то, с чем я буду идти. Спасибо! –

ответ

2

Как сказал г-н Бармар, вероятно, лучший подход к этим обстоятельствам решает его программно. Вы можете написать обычное регулярное выражение для соответствия правильному шаблону и исключить его из коллекции.

Но вы можете попробовать это:

^(?:.(?!-bucket-logs-[a-z]{2}-[a-z]{4,}-\d|-bucket-logs$))*$ 

, который является типичным решением при использовании отрицательного lookeahead, который не является захват группы, с нулевой длиной (?!). В основном это говорит о том, что вы хотите, чтобы каждая строка начиналась с чего-то, но не имела шаблона после него.

EDITED

Как Ибрагим указал (спасибо!), Была небольшая проблема с моим первым регулярным выражением. Я исправил это, и я думаю, теперь все в порядке. Я забыл установить последнюю часть внутреннего регулярного выражения как необязательный (?).

+1

Вы вводите код 'test-bucket-logs', который является допустимым именем ведра. Попробуйте добавить исключение, чтобы исключить его, возможно, что-то вроде этого: '^ (?:. (?! - bucket-logs- [az] {2} - [az] {4,} - \ d | -bucket-logs $)) * $ ' – Ibrahim

+0

Я исправил это. Спасибо, мужик! –

Смежные вопросы