Visita il nuovo sito https://www.markonetools.it/regular-expressions/
Le "regular expressions" (o regex in breve) sono un linguaggio usato per analizzare e manipolare le stringhe di testo in maniera complessa, Le regular expression sono incluse in molti linguaggi di programmazione tra cui anche SQL di DB2 for i a partire dalla versione IBM i 7.1.
Una regular expression è una stringa che contiene una combinazione di caratteri e metacaratteri. Il pattern matching operato dal regular expression engine cerca una porzione di testo che è descritta dalla regular expression.
regexp_count
: restituisce il numero di occorrenze trovato in una stringa della regular expressionregexp_instr
: restituisce la posizione iniziale dell'occorrenza trovata in una stringa della regular expressionregexp_replace
: sostituisce la regular expression trovata in una stringa con un'latra stringaregexp_substr
: restituisce la sottostringa dell'occorrenza trovata in una stringa della regular expressionregexp_like
: questo predicato usato in una clausola where cerca la pattern-expression nella stringa source-string. Se la trova restituisce true altrimenti false.regexp_like(source-string, pattern-expression, start, flags)
Il parametro flags nelle funzioni e nel predicato delle regular expressions condiziona la modalità di analisi della stringa. I flag possono anche essere combinati.
c
: ricerca case sensitive. E' il valore di default.i
: ricerca case insensitivem
: specifica che la stringa di origine può contenere una o più righen
o s
: specifica che il carattere '.' nella regular expression identifica la ricerca del fine rigax
: specifica che gli spazi nella regular expression sono ignoratiDi seguito propongo alcuni esempi pratici di utilizzo delle regular expressions per effettuare dei controlli di validità formali di stringhe che debbano rispettare alcune regole di composizione: p.es. indirizzi email, indirizzi IP, codice fiscale, partita IVA...
Per una trattazione completa della sintassi delle regular expressions si può consultare il manuale IBM "SQL Reference".
Gli esempi sono costruiti utilizzando l'operatore regexp_like, ma la sintassi è del tutto simile anche per le altre funzioni. Per brevità dopo il primo esempio ho indicato solo la porzione di codice dell'operatore regexp_like
select count(*)
from SYSIBM/SYSDUMMY1
where regexp_like('192.168.10.14', '(\d|[01]?\d\d|2[0-4]\d|25[0-5])\.(\d|[01]?\d\d|2[0-4]\d|25[0-5])\.(\d|[01]?\d\d|2[0-4]\d|25[0-5])\.(\d|[01]?\d\d|2[0-4]\d|25[0-5])$')
regexp_like('fe80:0000:0000:0000:02a0:24ff:fe77:4997', '(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6} (?:[0-9]{1,3}\.){3}[0-9]{1,3}$) (([0-9A-F]{1,4}:){0,5}|:)((:[0-9A-F]{1,4}){1,5}:|:))(?:(?:25[0-5]|2[0-4][0-9]| [01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:))', 'i')
regexp_like('01:23:45:67:89:ab', '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$')
regexp_like('31-03-2016', '^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$')
regexp_like('4012345678901234', '^4[0-9]{12}(?:[0-9]{3})?$')
regexp_like('5112345678901234',
'^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$')
regexp_like('341234567890123', '^3[47][0-9]{13}$')
regexp_like('RSSMRA70H25A940U', '^[a-z]{6}[0-9]{2}[a-z][0-9]{2}[a-z][0-9]{3}[a-z]$', 'i')
regexp_like('01234567890', '^[0-9]{11}$')
regexp_like('pippo.jpeg', '^.+\.(jpeg|jpg|png|gif|bmp)$')
regexp_like('+39/329/1234567', '(00|\+)[0-9]{2}[\/|\-|\.]?[0-9]{3}[\/|\-|\.]?[0-9]{6,7}+$', 'i')
Di seguito un esempio di utilizzo delle regular expressions per eseguire il controllo formale di validità del contenuto di una variabile in un programma RPG.
Viene esposto sia l'utilizzo dell'operatore regexp_like oppure della funzione regexp_count
dcl-s fValido uns(3);
dcl-s Valore varchar(100);
dcl-s Regola varchar(100);
dcl-s Msg char(52);
Valore = '4012345678901234';
Regola = '^4[0-9]{12}(?:[0-9]{3})?$';
exec sql
select count(*) into :fValido
from SYSIBM/SYSDUMMY1
where regexp_like(:Valore, :Regola);
if fValido > *zeros;
Msg = 'Controllo di validità corretto';
else;
Msg = 'Controllo di validità errato';
endif;
dsply msg '*EXT';
exec sql
set :fValido = regexp_count(:Valore, :Regola);
if fValido > *zeros;
Msg = 'Controllo di validità corretto';
else;
Msg = 'Controllo di validità errato';
endif;
dsply msg '*EXT';
*inlr = *on;
Di seguito un esempio di utilizzo delle regular expressions incapsulata in una funzione scalare SQL.
-- funzione di controllo carta credito Visa. Restituisce 1 se valido, 0 se non valido
create or replace function checkVisa(NumCarta varchar(16))
returns integer
language sql
deterministic
begin
declare Regola char(50);
declare fValido integer;
set Regola = '^4[0-9]{12}(?:[0-9]{3})?$';
set fValido = regexp_count(NumCarta, trim(Regola));
if fValido > 1 then set fValido = 1;
end if;
return fValido;
end;
Esempio di utilizzo della funzione
select checkVisa('4012345678901234')
from SYSIBM/SYSDUMMY1;
Bibliografia