Регулярні вирази є потужним інструментом для роботи з рядковими даними. У Stata 18 регулярні вирази стали ще потужнішими, з більшою кількістю можливостей.
Огляд
Регулярні вирази використовуються для
-
перевірка даних, наприклад, щоб перевірити, чи правильно сформовано номер телефону;
-
вилучення даних, наприклад, для вилучення телефонних номерів з рядка; і
-
перетворення даних, наприклад, для нормалізації різних вхідних номерів телефонів.
Stata надає два набори функцій регулярних виразів: regexm(), regexr() і regexs() на основі байтового потоку та ustrregexm(), ustrregexrf(), ustrregexra() і ustrregexs() на основі Unicode. Функції регулярних виразів на основі Юнікоду побудовано поверх бібліотек ICU.
У Stata 18 функції на основі байтових потоків оновлено, щоб використовувати бібліотеку Boost як рушій. Функції контролюються користувацькою версією, щоб зберегти стару поведінку, якщо користувач вкаже версію 17:.
Детальне обговорення регулярних виразів у Stata можна знайти у посібнику Асджада Накві (Asjad Naqvi) з Stata.
Стара реалізація заснована на алгоритмі NFA Генрі Спенсера і майже ідентична стандарту POSIX.2. Нова реалізація у Stata 18 має більше можливостей. Наприклад, нова реалізація підтримує {n} для збігу регулярного виразу рівно n разів:
. display regexm("123", "\d{3}") 1 . version 17: display regexm("123", "\d{3}") 0
Додано набір нових функцій, які використовують виключно бібліотеку Boost:
-
regexmatch() виконує порівняння регулярного виразу з ASCII-рядком.
-
regexreplace() замінює перший підрядок, що відповідає регулярному виразу, на вказаний текст.
-
regexreplaceall() замінює всі підрядки, що відповідають регулярному виразу, на вказаний текст.
-
regexcapture() повертає підвираз з попереднього збігу.
-
regexcapturenamed() повертає підвираз, що відповідає іменованій групі у регулярному виразі з попереднього збігу.
Подивимося, як це працює
Ми хотіли б зіставити і витягти номери телефонів в адресах глав урядів.
Ми вимагаємо дотримання наступних правил:
-
Номер телефону слідує за “Phone:” або “tel:”.
-
Він може починатися з “+”.
-
Після “+” або на початку, він має від 1 до 3 ненульових цифр.
-
Після цього може бути від 7 до 32 цифр, пробіл або “-“.
Ми хочемо згенерувати змінну phone для витягнутого номера телефону, яка не містить “Phone:” або “tel:”, якщо адреса збігається.
Ми хочемо згенерувати іншу змінну, address1, щоб замінити номер телефону на витягнутий номер телефону у наведеному вище прикладі з додаванням “tel:”.
Компоненти регулярного виразу в локальному макросі reg наступні:
-
(?:Phone\:[\s]*?|tel\:[\s]*)– зіставити або “Phone:”, або “tel:”, після яких немає пробілів, або є, але не фіксує збіг.
-
([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})– зіставити і записати регулярний вираз, який задовольняє наступним умовам:
-
[+]{0, 1} – може починатися з “+”.
-
[1-9]{1, 3}– після “+” або на початку може містити від 1 до 3 ненульових цифр.
-
[0-9\s-]{7,32} – далі може містити від 7 до 32 цифр, пробіл або “-“.
-
Ми бачимо, що третя адреса не містить ні “Phone:”, ні “tel:”, а отже, не відповідає регулярному виразу, тому телефон відсутній у цьому спостереженні.