sql >> Database teknologi >  >> RDS >> Oracle

Regulært udtryk (RegEx) for IPv6 Adskilt fra IPv4

Med meget hjælp fra @nhahtdh i dette svar https://stackoverflow.com/a/21943960/3112803 Jeg har fundet ud af at bryde det op for at være den bedste løsning. Nedenfor er et eksempel på, hvordan man gør det i PL/SQL , men det kunne gøres på denne måde på andre sprog. Jeg vil gøre det samme i ColdFusion . Til PL/SQL det mønster, der skal til for at holde sig under 512 tegn, så at bryde det op fungerer godt, og det er nemt at forstå. Det bestod alle mine testcases i det oprindelige spørgsmål.

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. 25 Microsoft Access-genveje for at spare tid i tabeller i dataarkvisning

  2. MySQL-forespørgsel GRUPPER EFTER dag / måned / år

  3. Flere af mine foretrukne PostgreSQL-forespørgsler - og hvorfor de også betyder noget

  4. Postgresql enum hvad er fordelene og ulemperne?