Oracle
 sql >> база данни >  >> RDS >> Oracle

Редовен израз (RegEx) за IPv6 Отделно от IPv4

С много помощ от @nhahtdh в този отговор https://stackoverflow.com/a/21943960/3112803 Намерих разпадането му за най-доброто решение. По-долу е даден пример как да го направите в PL/SQL , но може да се направи и на други езици. Ще направя същото в ColdFusion . За PL/SQL шаблонът, необходим, за да остане под 512 знака, така че разделянето му работи чудесно и е лесно за разбиране. Издържа всичките ми тестови случаи в оригиналния въпрос.

if (
    /* IPv6 expanded */
    REGEXP_LIKE(v, '\A[[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){7}\z')
    /* IPv6 shorthand */
    OR (NOT REGEXP_LIKE(v, '\A(.*?[[:xdigit:]](:|\z)){8}')
    AND REGEXP_LIKE(v, '\A([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,6})?::([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,6})?\z'))
    /* IPv6 dotted-quad notation, expanded */
    OR REGEXP_LIKE(v, '\A[[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){5}:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}\z')
    /* IPv6 dotted-quad notation, shorthand */
    OR (NOT REGEXP_LIKE(v, '\A(.*?[[:xdigit:]]:){6}')
    AND REGEXP_LIKE(v, '\A([[:xdigit:]]{1,4}(:[[:xdigit:]]{1,4}){0,4})?::([[:xdigit:]]{1,4}:){0,5}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}\z'))
) then


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-бързият начин да проверите дали някои записи в таблицата на базата данни?

  2. как да използвате XMLImporter и FndXdfCmp в Oracle EBS

  3. SQL - Как да изберете ред с колона с максимална стойност

  4. Как да форматирате числа в Oracle

  5. Тип на Java за дата/час, когато използвате Oracle Date с Hibernate