Les expressions régulières sont des outils puissants pour travailler avec des données de type chaîne de caractères. Les expressions régulières de Stata sont devenues encore plus puissantes, avec plus de fonctionnalités, dans Stata 18.
Vue d’ensemble
Les expressions régulières sont utilisées pour
-
la validation des données, par exemple pour vérifier si un numéro de téléphone est bien formé ;
-
l’extraction de données, par exemple pour extraire les numéros de téléphone d’une chaîne ; et
-
la transformation des données, par exemple pour normaliser différentes entrées de numéros de téléphone.
Stata fournit deux ensembles de fonctions d’expression régulière : regexm(), regexr() et regexs() basées sur les flux d’octets ; et ustrregexm(), ustrregexrf(), ustrregexra() et ustrregexs() basées sur l’Unicode. Les fonctions d’expression régulière basées sur l’Unicode sont construites sur les bibliothèques ICU.
Dans Stata 18, les fonctions basées sur les flux d’octets ont été mises à jour pour utiliser la bibliothèque Boost comme moteur. Les fonctions sont contrôlées par la version de l’utilisateur afin de conserver l’ancien comportement si l’utilisateur spécifie la version 17 :.
Une bonne discussion sur les expressions régulières dans Stata peut être trouvée dans le guide Stata d’Asjad Naqvi.
L’ancienne implémentation est basée sur l’algorithme NFA de Henry Spencer et est presque identique à la norme POSIX.2. La nouvelle implémentation dans Stata 18 a plus de fonctionnalités. Par exemple, la nouvelle implémentation supporte {n} pour faire correspondre une expression régulière exactement n fois :
. display regexm("123", "\d{3}") 1 . version 17: display regexm("123", "\d{3}") 0
Une série de nouvelles fonctions utilisant exclusivement la bibliothèque Boost ont été ajoutées :
-
regexmatch() effectue une correspondance entre une expression régulière et une chaîne ASCII.
-
regexreplace() remplace la première chaîne de caractères qui correspond à une expression régulière par le texte spécifié.
-
regexreplaceall() remplace toutes les sous-chaînes qui correspondent à une expression régulière par le texte spécifié.
-
regexcapture() renvoie une sous-expression d’une correspondance précédente.
-
regexcapturenamed() renvoie une sous-expression correspondant à un groupe nommé correspondant dans une expression rationnelle d’une correspondance précédente.
Voyons comment cela fonctionne
Nous souhaitons faire correspondre et extraire des numéros de téléphone dans les adresses des chefs de gouvernement.
Nous avons besoin des règles suivantes :
-
Le numéro de téléphone suit « Phone : » ou « tel : ».
-
Il peut commencer par « + ».
-
Après « + » ou au début, il comporte 1 à 3 chiffres non nuls.
-
Ensuite, il peut comporter de 7 à 32 chiffres, un espace ou « -« .
Nous aimerions générer une variable, phone, pour le numéro de téléphone extrait, qui ne contient pas « Phone : » ou « tel : » si l’adresse correspond.
Nous aimerions générer une autre variable, address1, pour remplacer le numéro de téléphone par le numéro de téléphone extrait dans l’exemple ci-dessus suivi de « tel : ».

Les composants de l’expression régulière dans la macro locale reg sont les suivants :
-
(?:Phone :[\s]*?|tel :[\s]*)-correspond à « Phone : » ou « tel : » suivi d’aucun espace ou de quelques espaces, mais ne capture pas la correspondance.
-
([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})-recherche et capture d’une expression régulière répondant aux critères suivants :
-
[+]{0, 1}-il peut commencer par « + ».
-
[1-9]{1, 3}-après « + » ou au début, il comporte de 1 à 3 chiffres non nuls.
-
[0-9\s-]{7,32}-après cela, il peut comporter de 7 à 32 chiffres, un espace ou « -« .
-
Nous constatons que la troisième adresse ne contient ni « Phone : » ni « tel : » et ne correspond donc pas à l’expression régulière.