sql >> Databasteknik >  >> RDS >> Oracle

Regular Expression (RegEx) för IPv6 Separat från IPv4

Med mycket hjälp från @nhahtdh i det här svaret https://stackoverflow.com/a/21943960/3112803 Jag har funnit att det är den bästa lösningen att bryta upp det. Nedan är ett exempel på hur man gör det i PL/SQL , men det kan göras på detta sätt på andra språk. Jag kommer att göra detsamma i ColdFusion . För PL/SQL mönstret som behövs för att hålla sig under 512 tecken så att bryta upp det fungerar utmärkt och det är enkelt att förstå. Den klarade alla mina testfall i den ursprungliga frågan.

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. Bygga en mycket tillgänglig databas för Moodle med MySQL-replikering

  2. SQL Unik begränsning över flera tabeller

  3. SQL Server Agent Alerts

  4. Vilka effekter har användningen av en binär sammanställning?