Regulární výrazy jsou mocným nástrojem pro práci s řetězcovými daty. Ve Statě 18 jsou regulární výrazy ještě výkonnější a mají více funkcí.
Přehled
Regulární výrazy se používají pro
-
ověřování dat, například pro kontrolu správného tvaru telefonního čísla;
-
extrakce dat, například pro extrakci telefonních čísel z řetězce; a
-
transformace dat, například k normalizaci různých vstupů telefonních čísel.
Stata poskytuje dvě sady regulárních výrazů: regexm(), regexr() a regexs() založené na proudu bajtů a ustrregexm(), ustrregexrf(), ustrregexra() a ustrregexs() založené na Unicode. Funkce regulárních výrazů založené na Unicode jsou postaveny nad knihovnami ICU.
Ve Stata 18 jsou funkce založené na proudu bajtů aktualizovány tak, aby jako engine používaly knihovnu Boost. Funkce jsou řízeny uživatelskou verzí, aby zachovaly staré chování, pokud uživatel zadá verzi 17:.
Dobrou diskusi o regulárních výrazech ve Statě lze nalézt v příručce Stata od Asjada Naqviho.
Stará implementace je založena na algoritmu NFA Henryho Spencera a je téměř identická se standardem POSIX.2. Nová implementace ve Stata 18 má více funkcí. Nová implementace například podporuje {n} pro přiřazení regulárního výrazu přesně n-krát:
. display regexm("123", "\d{3}") 1 . version 17: display regexm("123", "\d{3}") 0
Byla přidána sada nových funkcí, které využívají výhradně knihovnu Boost:
-
regexmatch() provede shodu regulárního výrazu s řetězcem ASCII.
-
regexreplace() nahradí první podřetězec, který odpovídá regulárnímu výrazu, zadaným textem.
-
regexreplaceall() nahradí všechny podřetězce, které odpovídají regulárnímu výrazu, zadaným textem.
-
regexcapture() vrátí podvýraz z předchozí shody.
-
regexcapturenamed() vrací podvýraz odpovídající odpovídající pojmenované skupině v regulárním výrazu z předchozí shody.
Podívejme se, jak to funguje
Chtěli bychom porovnat a vyjmout telefonní čísla z adres předsedů vlád.
Požadujeme následující pravidla:
-
Telefonní číslo následuje za „Phone:“ nebo „tel:“.
-
Může začínat znakem „+“.
-
Za „+“ nebo na začátku má 1 až 3 nenulové číslice.
-
Poté může mít 7 až 32 číslic, mezeru nebo „-„.
Pro extrahované telefonní číslo bychom chtěli vygenerovat proměnnou phone, která neobsahuje „Phone:“ nebo „tel:“, pokud se adresa shoduje.
Chtěli bychom vygenerovat další proměnnou, adresa1, která by nahradila telefonní číslo s extrahovaným telefonním číslem ve výše uvedeném případě následovaným „tel:“.

Součásti regulárního výrazu v lokálním makru reg jsou následující:
-
(?:Phone\:[\s]*?|tel\:[\s]*)– odpovídá buď „Phone:“, nebo „tel:“, za kterým následují mezery nebo některé mezery, ale nezachycují shodu.
-
([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})-zachytí regulární výraz, který splňuje následující podmínky:
-
[+]{0, 1} – může začínat znakem „+“.
-
[1-9]{1, 3} – za „+“ nebo na začátku má 1 až 3 nenulové číslice.
-
[0-9\s-]{7,32}-po tomto znaku může mít 7 až 32 číslic, mezeru nebo „-„.
-
Vidíme, že třetí adresa neobsahuje ani „Phone:“, ani „tel:“, a tudíž neodpovídá regulárnímu výrazu, takže u tohoto pozorování telefon chybí.