New In

Регулярні вирази на основі бусту

Основні моменти

  • Вибір моделі для моделей ARIMA та ARFIMA

     

  • Інформаційні критерії AIC, BIC та HQIC

Регулярні вирази є потужним інструментом для роботи з рядковими даними. У 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:”, а отже, не відповідає регулярному виразу, тому телефон відсутній у цьому спостереженні.