SQL RegEx для подтверждения формата

Вопрос или проблема

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

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

Этот запрос проходит:

SELECT REGEXP_LIKE('3-Abc-Def_Ghi_ValueNumber2_ValueNumber3_ValueNumber4_ValueNumber5_ValueNumber6','[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,20}_[A-Za-z0-9]{3,20}_[A-Za-z0-9]{3,20}.*');

Этот запрос не проходит:

SELECT REGEXP_LIKE('3-Abc-Def_Ghi_ValueNumber2_ValueNumber3_ValueNumber4__ValueNumber6','[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,20}_[A-Za-z0-9]{3,20}_[A-Za-z0-9]{3,20}.*');

Ниже приведены еще несколько примеров значений для подтверждения решения:

'3-ABC-DEF_GHI_ValueNumber2_ValueNumber3_ValueNumber4__ValueNumber6'
'23-ABC-DEF_GHI_ValueNumber2_Value3_ValueNumber4'
'23-AB-DEF_GHIJK_ValueNumber2_ValueNumber3_ValueNumber4_ValueNumber5'

Ответ или решение

Чтобы подтвердить формат строки, содержащей определённые компоненты, вы можете использовать регулярные выражения в SQL. Ваша цель — обеспечить, чтобы строка соответствовала формату, который включает в себя числа, буквы и некоторые разделители, при этом делать часть значений необязательной.

По вашему примеру строка имеет следующий формат:

  • Первая часть: 1 или 2 цифры.
  • Вторая часть: 3 буквы (может быть как буквы, так и цифры).
  • Третья часть: 3 буквы (также может быть как буквы, так и цифры).
  • Четвёртая часть: 3-17 букв или цифр, следующее за _.
  • Пятая часть: 3-20 букв или цифр, следующее за _.
  • Шестая часть: 3-20 букв или цифр, следующее за _.
  • Седьмая часть: 3-20 букв или цифр, следующее за _ (но это значение может быть отсутствующим).

Чтобы учесть, что пятая часть (или значение_5) может отсутствовать, мы можем использовать оператор ?, который означает "ноль или одно вхождение", для обозначения необязательной части в регулярном выражении.

Вот данное регулярное выражение:

SELECT REGEXP_LIKE(
  '3-Abc-Def_Ghi_ValueNumber2_ValueNumber3_ValueNumber4__ValueNumber6', 
  '[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_(?:[A-Za-z0-9]{3,20}(_[A-Za-z0-9]{3,20})?)?(?:_[A-Za-z0-9]{3,20})?'
);

Данное регулярное выражение включает в себя:

  1. [0-9]{1,2}: 1 или 2 цифры.
  2. -[A-Za-z0-9]{3}: дефис и 3 буквы или цифры.
  3. _[A-Za-z0-9]{3}: подчеркивание и 3 буквы или цифры.
  4. _[A-Za-z0-9]{3,17}: подчеркивание и 3-17 букв или цифр для четвёртой части.
  5. _(?:[A-Za-z0-9]{3,20}(_[A-Za-z0-9]{3,20})?)?: подчеркивание и 3-20 буквы или цифры, причём эта часть может отсутствовать.
  6. (?:_[A-Za-z0-9]{3,20})?: подчеркивание и 3-20 буквы или цифры — эта часть также может отсутствовать.

Теперь ваше регулярное выражение будет корректно обрабатывать строки как с отсутствующей пятый частью, так и без неё.

Вот примеры проверок с использованием данного метода:

SELECT REGEXP_LIKE('3-ABC-DEF_GHI_ValueNumber2_ValueNumber3_ValueNumber4__ValueNumber6',
                   '[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_(?:[A-Za-z0-9]{3,20}(_[A-Za-z0-9]{3,20})?)?(?:_[A-Za-z0-9]{3,20})?');

SELECT REGEXP_LIKE('23-ABC-DEF_GHI_ValueNumber2_Value3_ValueNumber4',
                   '[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_(?:[A-Za-z0-9]{3,20}(_[A-Za-z0-9]{3,20})?)?(?:_[A-Za-z0-9]{3,20})?');

SELECT REGEXP_LIKE('23-AB-DEF_GHIJK_ValueNumber2_ValueNumber3_ValueNumber4_ValueNumber5',
                   '[0-9]{1,2}-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}_[A-Za-z0-9]{3,17}_[A-Za-z0-9]{3,17}_(?:[A-Za-z0-9]{3,20}(_[A-Za-z0-9]{3,20})?)?(?:_[A-Za-z0-9]{3,20})?');

Таким образом, ваши строки будут корректно проверены на соответствие необходимому формату!

Оцените материал
Добавить комментарий

Капча загружается...