sql >> Database >  >> RDS >> Oracle

Reguliere expressie (RegEx) voor IPv6 gescheiden van IPv4

Met veel hulp van @nhahtdh in dit antwoord https://stackoverflow.com/a/21943960/3112803 Ik vond het opbreken de beste oplossing. Hieronder ziet u een voorbeeld van hoe u dit kunt doen in PL/SQL , maar het zou op deze manier in andere talen kunnen worden gedaan. Ik doe hetzelfde in ColdFusion . Voor PL/SQL het patroon moest onder de 512 tekens blijven, dus het opsplitsen werkt prima en het is eenvoudig te begrijpen. Het heeft al mijn testgevallen in de oorspronkelijke vraag doorstaan.

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. SQL DELETE met JOIN andere tabel voor WHERE voorwaarde

  2. SQL-sleutels, MUL versus PRI versus UNI

  3. DO's en DONT's voor indexen

  4. Zelfstudie Microsoft TreeView Control