New In

Expresii regulate bazate pe Boost

Repere

  • Selecția modelului pentru modelele ARIMA și ARFIMA

     

  • Criterii de informare AIC, BIC și HQIC

Expresiile regulate sunt instrumente puternice pentru lucrul cu date de tip șir de caractere. Expresiile regulate din Stata au devenit și mai puternice, cu mai multe caracteristici, în Stata 18.

Prezentare generală

Expresiile regulate sunt utilizate pentru

  • validarea datelor, de exemplu, pentru a verifica dacă un număr de telefon este bine format;

     

  • extragerea datelor, de exemplu, pentru a extrage numere de telefon dintr-un șir de caractere; și

     

  • transformarea datelor, de exemplu, pentru a normaliza diferite intrări de numere de telefon.

Stata oferă două seturi de funcții de expresii regulate: regexm(), regexr() și regexs() bazate pe flux de octeți; și ustrregexm(), ustrregexrf(), ustrregexrf(), ustrregexra() și ustrregexs() bazate pe Unicode. Funcțiile de expresii regulate bazate pe Unicode sunt construite pe baza bibliotecilor ICU.

În Stata 18, funcțiile bazate pe byte-stream sunt actualizate pentru a utiliza biblioteca Boost ca motor. Funcțiile sunt controlate în funcție de versiunea utilizatorului pentru a păstra vechiul comportament dacă un utilizator specifică versiunea 17:.

O discuție bună despre expresiile regulate în Stata poate fi găsită în ghidul Stata al lui Asjad Naqvi.

Vechea implementare se bazează pe algoritmul NFA al lui Henry Spencer și este aproape identică cu standardul POSIX.2. Noua implementare din Stata 18 are mai multe caracteristici. De exemplu, noua implementare suportă {n} pentru a potrivi o expresie regulată exact de n ori:

. display regexm("123", "\d{3}")
1

. version 17: display regexm("123", "\d{3}")
0

A fost adăugat un set de funcții noi care utilizează exclusiv biblioteca Boost:

  • regexmatch() efectuează o potrivire a unei expresii regulate cu un șir ASCII.

     

  • regexreplace() înlocuiește prima subșiră care corespunde unei expresii regulate cu textul specificat.

     

  • regexreplaceall() înlocuiește toate subșirurile care corespund unei expresii regulate cu textul specificat.

     

  • regexcapture() returnează o subexpresie dintr-o potrivire anterioară.

     

  • regexcapturenamed() returnează o subexpresie care corespunde unui grup numit corespunzător într-o expresie regulată dintr-o potrivire anterioară.

Să vedem cum funcționează

Am dori să identificăm și să extragem numerele de telefon din adresele șefilor de guverne.

Avem nevoie de următoarele reguli:

  • Numărul de telefon urmează după „Phone:” sau „tel:”.

     

  • Acesta poate începe cu „+”.

     

  • După „+” sau la început, are între 1 și 3 cifre care nu sunt zero.

     

  • După aceea, poate avea între 7 și 32 de cifre, un spațiu sau „-„.

Am dori să generăm o variabilă, phone, pentru numărul de telefon extras, care să nu conțină „Phone:” sau „tel:” dacă adresa se potrivește.

Am dori să generăm o altă variabilă, address1, pentru a înlocui numărul de telefon cu numărul de telefon extras în cazul de mai sus, urmat de „tel:”.

Componentele expresiei regulate din macroul local reg sunt următoarele:

  • (?:Phone\:[\s]*?|tel\:[\s]*)-se potrivește fie cu „Phone:”, fie cu „tel:”, urmat de niciun spațiu sau de unele, dar nu și de capturarea corespondenței.

  • ([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})-se potrivește și captează o expresie regulată care satisface următoarele:

     

    • [+]{0, 1} – poate începe cu „+”.

       

    • [1-9]{1, 3} – după „+” sau la început, are între 1 și 3 cifre diferite de zero.

       

    • [0-9\s-]{7,32}-după aceasta, poate avea între 7 și 32 de cifre, spațiu sau „-„.

Observăm că a treia adresă nu conține nici „Phone:”, nici „tel:” și, prin urmare, nu se potrivește cu expresia regulată, astfel încât telefonul lipsește pentru această observație.