New In

Регулярни изрази, базирани на Boost

Акценти

  • Избор на модел за моделите ARIMA и ARFIMA

     

  • Информационни критерии AIC, BIC и HQIC

Регулярните изрази са мощни инструменти за работа с низови данни. Регулярните изрази на Stata станаха още по-мощни и с повече функции в Stata 18.

Преглед

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

  • валидиране на данни, например за проверка дали даден телефонен номер е добре оформен;

  • извличане на данни, например за извличане на телефонни номера от низ; и

     

  • трансформиране на данни, например за нормализиране на различни входни данни за телефонни номера.

Stata предоставя два набора от функции за регулярни изрази: regexm(), regexr() и regexs(), базирани на байтови потоци; и ustrregexm(), ustrregexrf(), ustrregexra() и ustrregexs(), базирани на Unicode. Функциите за регулярни изрази, базирани на Unicode, са изградени върху библиотеките на ICU.

В Stata 18 функциите, базирани на байтови потоци, са актуализирани, за да използват библиотеката Boost като двигател. Функциите се контролират от версията на потребителя, за да запазят старото поведение, ако потребителят посочи версия 17:.

Добро обсъждане на регулярните изрази в Stata може да се намери в ръководството за Stata на Asjad Naqvi.

Старата имплементация се основава на 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:“ и по този начин не отговаря на регулярния израз, така че за това наблюдение липсва телефон.