sql >> Databáze >  >> RDS >> Oracle

Regulární výraz (RegEx) pro IPv6 Oddělený od IPv4

S velkou pomocí od @nhahtdh v této odpovědi https://stackoverflow.com/a/21943960/3112803 Zjistil jsem, že rozbití je nejlepší řešení. Níže je uveden příklad, jak to udělat v PL/SQL , ale mohlo by to být provedeno tímto způsobem v jiných jazycích. Totéž udělám v ColdFusion . Pro PL/SQL vzor potřebný k tomu, aby zůstal pod 512 znaky, takže jeho rozdělení funguje skvěle a je snadno pochopitelné. Prošel všemi mými testovacími případy v původní otázce.

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. Psql se nemohl připojit k serveru:Žádný takový soubor nebo adresář, chyba 5432?

  2. DatabaseError:aktuální transakce je přerušena, příkazy jsou ignorovány až do konce bloku transakce?

  3. Jak vytvořit jedinečný index ve sloupci NULL?

  4. Nerozumím Collation? (Mysql, RDBMS, znakové sady)