Použití regulárních výrazů v databázi ORACLE
Podpora regulárních výrazů v databázi ORACLE zahrnuje funkce vyhledávání řetězců, hledání a extrakci podřetězce i nahrazování podřetězce za jiný text.
Funkce pro vyhledávání řádků v tabulce, které ve sloupci obsahují text odpovídající specifikovanému regulárnímu výrazu, se v databázi ORACLE nazývá REGEXP_LIKE (). Její použití je následující:
SELECT * FROM tabulka WHERE REGEXP_LIKE(sloupec,'reg. vyraz', modifikator)
Hledáme-li v tabulce řádky obsahující ve zvoleném textovém slouci datum, použijeme tento příkaz:
SELECT * FROM tabulka WHERE REGEXP_LIKE (sloupec, '[0123]?\d\.[01]?\d\.\d{2,4}', 'c');
Výsledek funkce REGEXP_LIKE je hodnota true v případě, že daný řádek tabulky obsahuje ve sloupci text odpovídající regulárnímu výrazu.
Regulární výraz můžeme použít i pro vyhledání či extrakci podřetězce z textu. Slouží k tomu funkce, které jsou obdobou textových funkcí SUBSTR() a INSTR(), pouze místo hledaného pevného řetězce používáme regulární výraz. Funkce pro extrakci podřetězce je definována takto:
REGEXP_SUBSTR(text, 'reg. vyraz', hledat_od, vyskyt, modifikator)
Pomocí této funkce extrahujeme ze sloupce podřetězec specifikovaný regulárním výrazem, hledání probíhá od specifikované pozice (třetí parametr), hledá se n-tý výskyt (čtvrtý parametr) při zohlednění modifikátorů specifikovaných posledním parametrem. Povinné parametry jsou první dva. Výsledem funkce je extrahovaný podřetězec nebo NULL.Zatímco funkci REGEXP_LIKE můžeme použít pouze při definování vyhledávací podmínky, ostatní REGEXP funkce můžeme použít v SQL dotazech na všech místech jako standardní funkce.
Extrakci datumu z textu provedeme tak, že stejný regulární výraz použijeme ve funkci REGEXP_LIKE() i REGEXP_SUBSTR():
SELECT REGEXP_SUBSTR(sloupec, '[0123]?\d\.[01]?\d\.\d{2,4}') datum FROM tabulka
WHERE REGEXP_LIKE(sloupec, '[0123]?\d\.[01]?\d\.\d{2,4}')
Pokud chceme získat pouze pozici podřetězce místo samotného podřetězce, použijeme místo funkce REGEXP_SUSBSTR() funkci REGEXP_INSTR(). Její parametry jsou shodné, pouze návratová hodnota je pozice prvního znaku podřetězce nebo nula.
U extrakce podřetězců se vrátíme k pojmům "greedy" a "nongreedy", které jsme zmínili u přehledu kvantifikátorů. Mějme situaci, kdy chceme z textu extrahovat text, který je uveden v závorkách. Text v závorkách může obsahovat libovolné znaky, například výsledek cytogenetického vyšetření.
SELECT REGEXP_SUBSTR('translokace t(9;22)', '\(.*\)') FROM DUAL
Pokud text obsahuje pouze jeden pár závorek, funkce správně vrátí podřetězec "(9;22)". Pokud ale prohledávaný text obsahuje více závorek, projeví se "hladovost" kvantifikátoru "*":
SELECT REGEXP_SUBSTR('translokace t(9;22) (Ph-chromozom) ', '\(.*\)') FROM DUAL
Výsledkem je "(9;22) (Ph-chromozom)", protože výraz ".*" byl roztažen na maximální počet znaků uzavřených mezi první otevírací závorkou a druhou uzavírací závorkou. Pokud chceme získat jen obsah první závorky, musíme použít "nehladový" kvantifikátor "*?":
SELECT REGEXP_SUBSTR('translokace t(9;22) (Ph-chromozom) ', '\(.*?\)') FROM DUAL
Pokud chceme hledaný podřetězec nahradit jiným textem, použijeme funkci REGEXP_REPLACE(). Její syntaxe je následující:
REGEXP_REPLACE(text, reg.výraz, novy_text, hledat_od, vyskyt, modifikator)
Oproti REGEXP_SUBSTR je tu rozdíl v třetím parametru, kterým je text nahrazující nalezený vzor. Parametr "vyskyt" specifukuje, kolikátý nález se má nahradit, pokud uvedeme nulu (výchozí hodnota), nahradí se všechny výskyty. Nahrazovaný text může obsahovat odkazy na bloky specifikované ve vyhledávaném regulárním výrazu. To nám umožní například převést český formát datumu na formát (rok-měsíc-den):
SELECT REGEXP_REPLACE(sloupec, '([0123]?\d)\.([01]?\d)\.(\d{4})', '\3-\2-\1') datum FROM tabulka
WHERE REGEXP_LIKE(sloupec, '[0123]?\d\.[01]?\d\.\d{2,4}')
Poslední významnou funkcí z REGEXP rodiny je REGEXP_COUNT(), která vrací počet nalezených výrazů v prohledávaném textu. Její syntaxe je:
REGEXP_COUNT(text, reg.výraz , hledat_od, modifikator)
Význam parametrů je stejný jako v případě funkce REGEXP_SUBSTR().