A reguláris kifejezések hatékony eszközök a karakterláncadatokkal való munkához. A Stata 18-ban a Stata reguláris kifejezések még erősebbek és több funkcióval rendelkeznek.
Áttekintés
A reguláris kifejezések a következőkre szolgálnak
-
adatérvényesítés, például annak ellenőrzése, hogy egy telefonszám jól van-e formázva;
-
adatkivonatolás, például telefonszámok kivonása egy karakterláncból; és
-
adattranszformáció, például a különböző telefonszám-bemenetek normalizálása.
A Stata kétféle reguláris kifejezés függvénykészletet biztosít: a bájtfolyam-alapú regexm(), regexr() és regexs(); és az Unicode-alapú ustrregexm(), ustrregexrf(), ustrregexra() és ustrregexs(). Az Unicode-alapú reguláris kifejezésfüggvények az ICU könyvtárakra épülnek.
A Stata 18-ban a bájtfolyam-alapú függvények frissítve vannak, hogy a Boost könyvtárat használják motorként. A függvények felhasználói verzióvezérlésűek, hogy a régi viselkedés megmaradjon, ha a felhasználó a 17-es verziót adja meg:.
A reguláris kifejezések jó tárgyalása a Stata-ban Asjad Naqvi Stata-útmutatójában található.
A régi implementáció Henry Spencer NFA algoritmusán alapul, és szinte teljesen megegyezik a POSIX.2 szabványban foglaltakkal. A Stata 18-ban található új implementáció több funkcióval rendelkezik. Például az új implementáció támogatja az {n} értéket a reguláris kifejezések pontosan n-szeri megfeleltetésére:
. display regexm("123", "\d{3}") 1 . version 17: display regexm("123", "\d{3}") 0
Egy sor új függvényt adtunk hozzá, amelyek kizárólag a Boost könyvtárat használják:
-
A regexmatch() egy reguláris kifejezés egyezését végzi el egy ASCII karakterlánccal.
-
A regexreplace() az első olyan részláncot, amely megfelel egy reguláris kifejezésnek, meghatározott szöveggel helyettesíti.
-
regexreplaceall() az összes olyan részláncot, amely megfelel egy reguláris kifejezésnek, meghatározott szöveggel helyettesíti.
-
regexcapture() egy korábbi egyezésből származó részkifejezést ad vissza.
-
A regexcapturenamed() egy korábbi egyezésből származó, a reguláris kifejezésben egyező nevű csoportnak megfelelő részkifejezést ad vissza.
Lássuk, hogyan működik
Szeretnénk a kormányfők címében szereplő telefonszámokat összevetni és kivonatolni.
A következő szabályokra van szükségünk:
-
A telefonszám a “Phone:” vagy “tel:” után következik.
-
Kezdődhet “+” betűvel.
-
A “+” után vagy az elején 1-3 nem nulla számjegyből áll.
-
Ezután 7 és 32 számjegy, szóköz vagy “-” következhet.
Szeretnénk a kivont telefonszámhoz egy telefon változót generálni, amely nem tartalmazza a “Phone:” vagy “tel:” feliratot, ha a cím megegyezik.
Szeretnénk egy másik változót generálni, a address1-et, hogy a telefonszámot a fentiekben a kivont telefonszámmal helyettesítsük, amelyet a “tel:” követ.

A reguláris kifejezés összetevői a helyi reg makróban a következők:
-
(?:Phone\:[\s]*?|tel\:[\s]*)– a “Phone:” vagy a “tel:” szóközök nélküli vagy néhány szóközös, de a találatot nem tartalmazó találat.
-
([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})– olyan reguláris kifejezés illesztése és rögzítése, amely megfelel a következőknek:
-
[+]{0, 1} – kezdődhet “+”-val.
-
[1-9]{1, 3} – a “+” után vagy az elején 1-3 nem nulla számjegyet tartalmaz.
-
[0-9\s-]{7,32} – ezután 7 és 32 számjegy, szóköz vagy “-” szerepelhet.
-
Látjuk, hogy a harmadik cím nem tartalmazza sem a “Phone:”, sem a “tel:” szót, és így nem felel meg a reguláris kifejezésnek, így a telefon hiányzik ebből a megfigyelésből.