Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Regulärer Ausdruck (RegEx) für IPv6 getrennt von IPv4

Mit viel Hilfe von @nhahtdh in dieser Antwort https://stackoverflow.com/a/21943960/3112803 Ich habe festgestellt, dass es die beste Lösung ist, es aufzulösen. Unten ist ein Beispiel dafür, wie man es in PL/SQL macht , aber es könnte auf diese Weise in anderen Sprachen gemacht werden. Ich mache dasselbe in ColdFusion . Für PL/SQL das Muster musste unter 512 Zeichen bleiben, also funktioniert das Aufteilen super und ist einfach zu verstehen. Es hat alle meine Testfälle in der ursprünglichen Frage bestanden.

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