New In

Boost-basierte reguläre Ausdrücke

Höhepunkte

  • Modellauswahl für ARIMA- und ARFIMA-Modelle

     

  • AIC-, BIC- und HQIC-Informationskriterien

Reguläre Ausdrücke sind mächtige Werkzeuge für die Arbeit mit String-Daten. Die regulären Ausdrücke von Stata sind in Stata 18 noch leistungsfähiger geworden und verfügen über mehr Funktionen.

Übersicht

Reguläre Ausdrücke werden verwendet für

  • Datenvalidierung, z. B. um zu prüfen, ob eine Telefonnummer richtig geformt ist;

     

  • Datenextraktion, z. B. zum Extrahieren von Telefonnummern aus einer Zeichenkette; und

     

  • Datentransformation, z. B. zur Normalisierung verschiedener Telefonnummern-Eingaben.

Stata bietet zwei Gruppen von Funktionen für reguläre Ausdrücke: byte-stream-basierte regexm(), regexr() und regexs(); und Unicode-basierte ustrregexm(), ustrregexrf(), ustrregexra() und ustrregexs(). Die Unicode-basierten Funktionen für reguläre Ausdrücke bauen auf den ICU-Bibliotheken auf.

In Stata 18 wurden die byte-stream-basierten Funktionen aktualisiert, um die Boost-Bibliothek als Engine zu verwenden. Die Funktionen sind benutzerversionsgesteuert, um das alte Verhalten beizubehalten, wenn ein Benutzer die Version 17: angibt.

Eine gute Diskussion über reguläre Ausdrücke in Stata findet sich im Stata-Handbuch von Asjad Naqvi.

Die alte Implementierung basiert auf dem NFA-Algorithmus von Henry Spencer und ist nahezu identisch mit dem POSIX.2-Standard. Die neue Implementierung in Stata 18 hat mehr Funktionen. Zum Beispiel unterstützt die neue Implementierung {n} für den Abgleich mit einem regulären Ausdruck genau n-mal:

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

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

Es wurde eine Reihe neuer Funktionen hinzugefügt, die ausschließlich die Boost-Bibliothek verwenden:

  • regexmatch() führt eine Übereinstimmung eines regulären Ausdrucks mit einer ASCII-Zeichenkette durch.

     

  • regexreplace() ersetzt die erste Teilzeichenkette, die mit einem regulären Ausdruck übereinstimmt, durch den angegebenen Text.

     

  • regexreplaceall() ersetzt alle Teilzeichenketten, die mit einem regulären Ausdruck übereinstimmen, durch den angegebenen Text.

     

  • regexcapture() gibt einen Teilausdruck aus einer vorherigen Übereinstimmung zurück.

     

  • regexcapturenamed() gibt einen Unterausdruck zurück, der einer übereinstimmenden benannten Gruppe in einem regulären Ausdruck aus einer vorherigen Übereinstimmung entspricht.

Wir wollen sehen, wie es funktioniert

Wir möchten die Telefonnummern in den Adressen von Regierungschefs abgleichen und extrahieren.

Wir benötigen die folgenden Regeln:

  • Die Rufnummer folgt auf „Phone:“ oder „tel:“.

     

  • Sie kann mit „+“ beginnen.

     

  • Nach dem „+“ oder am Anfang hat sie 1 bis 3 Ziffern, die nicht Null sind.

     

  • Danach kann sie 7 bis 32 Ziffern, ein Leerzeichen oder ein „-“ enthalten.

Wir möchten eine Variable, phone, für die extrahierte Telefonnummer erzeugen, die weder „Phone:“ noch „tel:“ enthält, wenn die Adresse übereinstimmt.

Wir möchten eine weitere Variable, address1, generieren, um die Telefonnummer durch die oben extrahierte Telefonnummer, gefolgt von „tel:“, zu ersetzen.

Die Bestandteile des regulären Ausdrucks im lokalen Makro reg sind wie folgt:

  • (?:Phone\:[\s]*?|tel\:[\s]*)-erfüllt entweder „Phone:“ oder „tel:“, gefolgt von keinem Leerzeichen oder einigen Leerzeichen, aber ohne Erfassung der Übereinstimmung.

     

  • ([+]{0, 1}[1-9]{1, 3}[0-9\s-]{7,32})-erfaßt einen regulären Ausdruck, der die folgenden Bedingungen erfüllt:

     

    • [+]{0, 1} – sie kann mit „+“ beginnen.

       

    • [1-9]{1, 3} – nach „+“ oder am Anfang hat er 1 bis 3 Stellen, die nicht Null sind.

       

    • [0-9\s-]{7,32}-danach können 7 bis 32 Ziffern, ein Leerzeichen oder „-“ stehen.

Wir sehen, dass die dritte Adresse weder „Phone:“ noch „tel:“ enthält und somit nicht mit dem regulären Ausdruck übereinstimmt, so dass phone in dieser Beobachtung fehlt.