Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyrażenie regularne (RegEx) dla IPv6 Oddzielone od IPv4

Z dużą pomocą @nhahtdh w tej odpowiedzi https://stackoverflow.com/a/21943960/3112803 Uważam, że najlepszym rozwiązaniem jest rozbicie go. Poniżej znajduje się przykład, jak to zrobić w PL/SQL , ale można to zrobić w ten sposób w innych językach. Zrobię to samo w ColdFusion . Dla PL/SQL wzór musiał pozostać poniżej 512 znaków, więc rozbicie go działa świetnie i jest łatwe do zrozumienia. Zdał wszystkie moje przypadki testowe w pierwotnym pytaniu.

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. zatrzymaj się przy błędzie kompilacji w skrypcie sqlplus

  2. Tylko kopia zapasowa schematu SQL?

  3. Dlaczego Oracle 9i traktuje pusty ciąg jako NULL?

  4. Czy w ORACLE istnieje sposób na połączenie wielu wierszy w jeden, przy użyciu dwóch tabel, w których końcowe wartości są oddzielone przecinkami?

  5. jak korzystać z XMLImporter i FndXdfCmp w Oracle EBS