Auf dieser Seite

QRegExp Class

Die Klasse „QRegExp“ ermöglicht den Abgleich mit Mustern mithilfe regulärer Ausdrücke. Mehr...

Header: #include <QRegExp>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmake: QT += core5compat

Hinweis: Alle Funktionen dieser Klasse sind reentrant.

Öffentliche Typen

enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch }
enum PatternSyntax { RegExp, RegExp2, Wildcard, WildcardUnix, FixedString, W3CXmlSchema11 }

Öffentliche Funktionen

QRegExp()
QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
QRegExp(const QRegExp &rx)
~QRegExp()
QString cap(int nth = 0) const
int captureCount() const
QStringList capturedTexts() const
Qt::CaseSensitivity caseSensitivity() const
int countIn(const QString &str) const
QString errorString() const
bool exactMatch(const QString &str) const
QStringList filterList(const QStringList &stringList) const
int indexIn(const QStringList &list, int from) const
int indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const
bool isEmpty() const
bool isMinimal() const
bool isValid() const
int lastIndexIn(const QStringList &list, int from) const
int lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
int matchedLength() const
QString pattern() const
QRegExp::PatternSyntax patternSyntax() const
int pos(int nth = 0) const
QString removeIn(const QString &str) const
QString replaceIn(const QString &str, const QString &after) const
QStringList replaceIn(const QStringList &stringList, const QString &after) const
void setCaseSensitivity(Qt::CaseSensitivity cs)
void setMinimal(bool minimal)
void setPattern(const QString &pattern)
void setPatternSyntax(QRegExp::PatternSyntax syntax)
QStringList splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
void swap(QRegExp &other)
operator QVariant() const
bool operator!=(const QRegExp &rx) const
QRegExp &operator=(QRegExp &&other)
QRegExp &operator=(const QRegExp &rx)
bool operator==(const QRegExp &rx) const

Statische öffentliche Mitglieder

QString escape(const QString &str)
size_t qHash(const QRegExp &key, size_t seed = 0)
QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)
QDataStream &operator>>(QDataStream &in, QRegExp &regExp)

Ausführliche Beschreibung

Diese Klasse ist in Qt 6 veraltet. Bitte verwenden Sie für allen neuen Code stattdessen QRegularExpression. Richtlinien zur Portierung von altem Code von QRegExp auf QRegularExpression finden Sie unter Porting to QRegularExpression.

Ein regulärer Ausdruck, auch „regexp“ genannt, ist ein Muster zum Abgleichen von Teilzeichenfolgen in einem Text. Dies ist in vielen Kontexten nützlich, z. B.

ValidierungEin Regexp kann prüfen, ob eine Teilzeichenfolge bestimmte Kriterien erfüllt, z. B. ob es sich um eine ganze Zahl handelt oder ob sie keine Leerzeichen enthält.
SucheEin Regexp bietet leistungsfähigere Mustererkennung als das einfache Abgleichen von Teilzeichenfolgen, z. B. um eines der Wörter „Mail“, „Letter“ oder „Correspondence“ zu finden, aber keines der Wörter „E-Mail“, „Mailman“, „Mailer“, „Letterbox“ usw.
Suchen und ErsetzenEin regulärer Ausdruck kann alle Vorkommen einer Teilzeichenfolge durch eine andere Teilzeichenfolge ersetzen, z. B. alle Vorkommen von „&“ durch „&amp;“ ersetzen, außer wenn auf das „&“ bereits ein „amp;“ folgt.
ZeichenkettenteilungEin regulärer Ausdruck kann verwendet werden, um zu ermitteln, an welcher Stelle eine Zeichenkette aufgeteilt werden soll, z. B. beim Aufteilen von durch Tabulatoren getrennten Zeichenketten.

Es wird eine kurze Einführung in reguläre Ausdrücke gegeben, eine Beschreibung der regulären Ausdruckssprache von Qt, einige Beispiele sowie die Funktionsdokumentation selbst. QRegExp orientiert sich an der regulären Ausdruckssprache von Perl. Es unterstützt Unicode vollständig. QRegExp kann auch in einem einfacheren Modus mit Platzhaltern verwendet werden, der der Funktionalität in Befehlsshells ähnelt. Die von QRegExp verwendeten Syntaxregeln können mit ` setPatternSyntax()` geändert werden. Insbesondere kann die Mustersyntax auf ` QRegExp::FixedString` gesetzt werden, was bedeutet, dass das abzugleichende Muster als einfache Zeichenkette interpretiert wird, d. h., Sonderzeichen (z. B. Backslash) werden nicht maskiert.

Ein gutes Buch zum Thema reguläre Ausdrücke ist „Mastering Regular Expressions“ (3. Auflage) von Jeffrey E. F. Friedl, ISBN 0-596-52812-4.

Hinweis: In Qt 5 bietet die neue Klasse „ QRegularExpression “ eine Perl-kompatible Implementierung regulärer Ausdrücke und wird anstelle von „QRegExp“ empfohlen.

Sicherheitshinweise

QRegExp legt keine Begrenzung für die Ressourcen fest, die ein Muster beanspruchen darf, und die Größe seiner internen Puffer kann zu einem Überlauf führen. Ein relativ kleines, gezielt gestaltetes Muster kann daher den verfügbaren Speicher erschöpfen, einen Stapelüberlauf verursachen oder den Speicher beschädigen. Dies geschieht während der Kompilierung des Musters, d. h. sobald das Muster zugewiesen wird, und erfordert keine Textübereinstimmung. Dasselbe gilt für „ wildcard “-Muster, die intern in reguläre Ausdrücke übersetzt werden.

Verwenden Sie QRegExp nur mit Mustern aus einer vertrauenswürdigen Quelle. Verwenden Sie stattdessen vorzugsweise „ QRegularExpression “, wodurch die Ressourcen begrenzt werden, die ein Abgleich verbrauchen darf.

Einführung

Regexps setzen sich aus Ausdrücken, Quantifikatoren und Assertionen zusammen. Der einfachste Ausdruck ist ein Zeichen, z. B. x oder 5. Ein Ausdruck kann auch eine in eckige Klammern gesetzte Zeichenfolge sein. [ABCD] passt auf ein A oder ein B oder ein C oder ein D. Denselben Ausdruck können wir auch als [A-D] schreiben, und ein Ausdruck, der auf jeden Großbuchstaben des englischen Alphabets passt, lautet [A-Z].

Ein Quantifikator gibt die Anzahl der Vorkommen eines Ausdrucks an, die abgeglichen werden müssen. x{1,1} bedeutet, dass genau ein x abgeglichen wird. x{1,5} bedeutet, dass eine Folge von x-Zeichen abgeglichen wird, die mindestens ein x, aber nicht mehr als fünf enthält.

Beachten Sie, dass reguläre Ausdrücke im Allgemeinen nicht zur Überprüfung auf ausgeglichene Klammern oder Tags verwendet werden können. Beispielsweise kann ein regulärer Ausdruck so geschrieben werden, dass er mit einem öffnenden HTML- <b> -Tag und dessen schließendem </b>-Tag übereinstimmt, sofern die <b> -Tags nicht verschachtelt sind; sind die <b> -Tags jedoch verschachtelt, wird derselbe reguläre Ausdruck mit einem öffnenden <b> -Tag und dem falschen schließenden </b>-Tag übereinstimmen. Für das Fragment <b>bold <b>bolder</b></b> würde das erste <b> mit dem ersten </b> abgeglichen werden, was nicht korrekt ist. Es ist jedoch möglich, einen regulären Ausdruck zu schreiben, der verschachtelte Klammern oder Tags korrekt abgleicht – allerdings nur, wenn die Anzahl der Verschachtelungsebenen feststeht und bekannt ist. Ist die Anzahl der Verschachtelungsebenen nicht feststehend und bekannt, ist es unmöglich, einen regulären Ausdruck zu schreiben, der nicht fehlschlägt.

Angenommen, wir möchten einen regulären Ausdruck erstellen, der auf ganze Zahlen im Bereich von 0 bis 99 passt. Da mindestens eine Ziffer erforderlich ist, beginnen wir mit dem Ausdruck [0-9]{1,1}, der genau einmal auf eine einzelne Ziffer passt. Dieser reguläre Ausdruck passt auf ganze Zahlen im Bereich von 0 bis 9. Um ganze Zahlen bis einschließlich 99 zu finden, erhöht man die maximale Anzahl der Vorkommen auf 2, sodass der reguläre Ausdruck zu [0-9]{1,2} wird. Dieser reguläre Ausdruck erfüllt die ursprüngliche Anforderung, ganze Zahlen von 0 bis 99 zu finden, findet jedoch auch ganze Zahlen, die in der Mitte von Zeichenketten vorkommen. Wenn die gefundene Ziffer die gesamte Zeichenkette umfassen soll, müssen wir die Ankerzeichen ^ (Caret) und $ (Dollar) verwenden. Steht ^ als erstes Zeichen in einem regulären Ausdruck, bedeutet dies, dass der Ausdruck vom Anfang der Zeichenkette an übereinstimmen muss. Ist $ das letzte Zeichen des regulären Ausdrucks, bedeutet dies, dass der reguläre Ausdruck bis zum Ende der Zeichenkette übereinstimmen muss. Der reguläre Ausdruck lautet dann ^[0-9]{1,2}$. Beachten Sie, dass Ankerzeichen wie ^ und $ keine Zeichen, sondern Positionen in der Zeichenkette angeben.

Falls Sie an anderer Stelle Beschreibungen von regulären Ausdrücken gesehen haben, sahen diese möglicherweise anders aus als die hier gezeigten. Das liegt daran, dass bestimmte Zeichenmengen und Quantoren so häufig vorkommen, dass ihnen spezielle Symbole zugewiesen wurden, um sie darzustellen. [0-9] kann durch das Symbol \dersetzt werden. Der Quantifikator für genau ein Vorkommen, {1,1}, kann durch den Ausdruck selbst ersetzt werden, d. h. x{1,1} ist dasselbe wie x. Unser Matcher für 0 bis 99 könnte also wie folgt geschrieben werden : ^\d{1,2}$. Er kann auch wie folgt geschrieben werden : ^\d\d {0,1}$, d. h . ab dem Anfang der Zeichenkette soll eine Ziffer gefunden werden, unmittelbar gefolgt von 0 oder 1 Ziffern. In der Praxis würde man ihn als ^\d\d ?$ schreiben . Das „?“ ist eine Kurzform für den Quantifikator {0,1}, d. h. 0 oder 1 Vorkommen. „?“ macht einen Ausdruck optional. Der reguläre Ausdruck ^\d\d ?$ bedeutet : Ab dem Anfang der Zeichenkette soll eine Ziffer gefunden werden, unmittelbar gefolgt von 0 oder 1 weiteren Ziffern, unmittelbar gefolgt vom Ende der Zeichenkette.

Um einen regulären Ausdruck zu schreiben, der mit einem der Wörter „mail“ , „letter“ oder „correspondence“ übereinstimmt, jedoch nicht mit Wörtern, die diese Wörter enthalten, z. B. „email“, „mailman“, „mailer“ und „letterbox“, beginne mit einem regulären Ausdruck, der mit „mail“ übereinstimmt. Vollständig ausgedrückt lautet der reguläre Ausdruck m{1,1}a{1,1}i{1,1}l{1,1}, aber da ein Zeichenausdruck automatisch durch {1,1} quantifiziert wird, können wir den regulären Ausdruck auf „mail“ vereinfachen, d. h. ein „m“, gefolgt von einem „a“, gefolgt von einem „i“, gefolgt von einem „l“. Nun können wir den senkrechten Strich |, der „oder“ bedeutet, verwenden, um die beiden anderen Wörter einzubeziehen, sodass unser regulärer Ausdruck zum Abgleichen eines der drei Wörter zu „mail|letter|correspondence“ wird. Suche nach „mail“ oder „letter“ oder „correspondence“. Dieser reguläre Ausdruck findet zwar eines der drei Wörter, die wir suchen, aber er findet auch Wörter, die wir nicht suchen, z. B. „email“. Um zu verhindern, dass der reguläre Ausdruck unerwünschte Wörter findet, müssen wir ihm mitteilen, dass die Suche an Wortgrenzen beginnen und enden soll. Zunächst setzen wir unseren regulären Ausdruck in Klammern: (mail|letter|correspondence). Klammern gruppieren Ausdrücke und kennzeichnen einen Teil des regulären Ausdrucks, den wir „ capture “ möchten. Durch das Einfassen des Ausdrucks in Klammern können wir ihn als Bestandteil komplexerer regulärer Ausdrücke verwenden. Außerdem können wir so überprüfen, welches der drei Wörter tatsächlich gefunden wurde. Um zu erzwingen, dass die Übereinstimmung an Wortgrenzen beginnt und endet, setzen wir den regulären Ausdruck in \bWortgrenzen-Assertionen ein: \b(mail|letter|correspondence)\b. Nun bedeutet der reguläre Ausdruck: Finde eine Wortgrenze, gefolgt vom Ausdruck in Klammern, gefolgt von einer Wortgrenze. Die \b Assertion passt auf eine Position im regulären Ausdruck, nicht auf ein Zeichen. Eine Wortgrenze ist jedes Nicht-Wort-Zeichen, z. B. ein Leerzeichen, ein Zeilenumbruch oder der Anfang bzw. das Ende einer Zeichenkette.

Wenn wir das Und-Zeichen durch die HTML-Entität &amp; ersetzen wollen, lautet der zu suchende reguläre Ausdruck einfach &. Dieser reguläre Ausdruck findet jedoch auch Und-Zeichen, die bereits in HTML-Entitäten umgewandelt wurden. Wir möchten nur „&“-Zeichen ersetzen, auf die nicht bereits „amp;“ folgt. Dazu benötigen wir die negative Vorausschau-Bedingung (?!__). Der reguläre Ausdruck lässt sich dann als &(?!amp;) schreiben, d. h. er passt auf ein „&“-Zeichen, auf das kein „amp;“ folgt.

Wenn wir alle Vorkommen von „Eric“ und „Eirik“ in einer Zeichenkette zählen wollen, gibt es zwei gültige Lösungen: \b(Eric|Eirik)\b und \bEi?ri[ck]\b. Die Wortgrenzen-Assertion „\b “ ist erforderlich, um zu vermeiden, dass Wörter gefunden werden, die einen der beiden Namen enthalten, z. B. „Ericsson“. Beachten Sie, dass der zweite reguläre Ausdruck mehr Schreibweisen findet, als wir möchten: „Eric“, „Erik“, „Eiric“ und „Eirik“.

Einige der oben besprochenen Beispiele sind im Abschnitt „ code examples “ implementiert.

Zeichen und Abkürzungen für Zeichenmengen

ElementBedeutung
cEin Zeichen steht für sich selbst, sofern es keine spezielle Bedeutung in regulären Ausdrücken hat. Beispiel: c entspricht dem Zeichen c.
\cEin Zeichen, dem ein Backslash folgt, entspricht dem Zeichen selbst, sofern unten nichts anderes angegeben ist. Beispiel: Um ein literales Caret am Anfang einer Zeichenkette zu finden, schreiben Sie \^.
\aStimmt mit dem ASCII-Signalton (BEL, 0x07) überein.
\fEntspricht dem ASCII-Form-Feed (FF, 0x0C).
\nEntspricht dem ASCII-Zeilenvorschub (LF, 0x0A, Unix-Zeilenumbruch).
\rEntspricht dem ASCII-Wagenrücklauf (CR, 0x0D).
\tEntspricht dem ASCII-Horizontal-Tabulator (HT, 0x09).
\vEntspricht dem ASCII-Vertikaltabulator (VT, 0x0B).
\xhhhhEntspricht dem Unicode-Zeichen, das der Hexadezimalzahl hhhh (zwischen 0x0000 und 0xFFFF) entspricht.
\0ooo (d. h. \zero ooo)entspricht dem ASCII-/Latin1-Zeichen für die Oktalzahl ooo (zwischen 0 und 0377).
. (Punkt)Entspricht einem beliebigen Zeichen (einschließlich Zeilenumbruch).
\dEntspricht einer Ziffer (QChar::isDigit()).
\DEntspricht einem Nicht-Ziffernzeichen.
\sEntspricht einem Leerzeichen (QChar::isSpace()).
\SEntspricht einem Nicht-Leerzeichen.
\wEntspricht einem Wortzeichen (QChar::isLetterOrNumber(), QChar::isMark() oder '_').
\WEntspricht einem Nicht-Wortzeichen.
\nDie n-te Rückreferenz, z. B. \1, \2 usw.

Hinweis: Der C++-Compiler wandelt Backslashes in Zeichenketten um. Um ein \ in einem regulären Ausdruck einzufügen, geben Sie es zweimal ein, d. h. \\. Um das Backslash-Zeichen selbst zu finden, geben Sie es viermal ein, d. h. \\\\.

Zeichenmengen

Eckige Klammern bedeuten, dass jedes darin enthaltene Zeichen gefunden werden soll. Die oben beschriebenen Zeichenmengenabkürzungen können in einer Zeichenmenge in eckigen Klammern vorkommen. Abgesehen von den Zeichenmengenabkürzungen und den folgenden zwei Ausnahmen haben Zeichen in eckigen Klammern keine besondere Bedeutung.

^Das Caret negiert die Zeichenmenge, wenn es als erstes Zeichen auftritt (d. h. unmittelbar nach der öffnenden eckigen Klammer). [abc] passt auf „a“ oder „b“ oder „c“, aber [^abc] passt auf alles außer „a“ oder „b“ oder „c“.
-Der Bindestrich kennzeichnet einen Zeichenbereich. [W-Z] passt auf „W“, „X“, „Y“ oder „Z“.

Die Verwendung der vordefinierten Zeichenmengen-Abkürzungen ist plattform- und sprachübergreifend portabler als die Verwendung von Zeichenbereichen. Beispielsweise passt [0-9] auf eine Ziffer in westlichen Alphabeten, während \d entspricht einer Ziffer in jedem beliebigen Alphabet.

Hinweis: In anderen Dokumentationen zu regulären Ausdrücken werden Zeichenmengen oft als „Zeichenklassen“ bezeichnet.

Quantifizierer

Standardmäßig wird ein Ausdruck automatisch durch {1,1} quantifiziert, d. h., er soll genau einmal vorkommen. In der folgenden Liste steht E für Ausdruck. Ein Ausdruck ist ein Zeichen, eine Abkürzung für eine Zeichenmenge, eine Zeichenmenge in eckigen Klammern oder ein Ausdruck in runden Klammern.

E?Entspricht null oder einem Vorkommen von E. Dieser Quantor bedeutet, dass der vorangehende Ausdruck optional ist, da er unabhängig davon, ob der Ausdruck gefunden wird oder nicht, übereinstimmt. E? entspricht E{0,1}. Beispielsweise entspricht „dents?“ den Zeichenfolgen „dent“ oder „dents“.
E+Passt auf ein oder mehrere Vorkommen von E. E+ entspricht E{1,}. Beispiel: 0+ passt auf „0“, „00“, „000“ usw.
E*Passt auf null oder mehr Vorkommen von E. Dies entspricht E{0,}. Der Quantor * wird häufig fälschlicherweise anstelle von + verwendet. Wenn beispielsweise „\s*$“ in einem Ausdruck verwendet wird, um Zeichenfolgen zu finden, die mit einem Leerzeichen enden, werden alle Zeichenfolgen gefunden, da „\s*$“ bedeutet: „Finde null oder mehr Leerzeichen, gefolgt vom Ende der Zeichenfolge“. Der korrekte reguläre Ausdruck, um Zeichenfolgen zu finden, die mindestens ein abschließendes Leerzeichen enthalten, lautet „\s+$“.
E{n}Erkennt genau n Vorkommen von E. E{n} entspricht der n-maligen Wiederholung von E. Beispielsweise entspricht x{5} dem Ausdruck xxxxx. Es entspricht auch E{n,n}, z. B. x{5,5}.
E{n,}Erkennt mindestens n Vorkommen von E.
E{,m}Ergibt höchstens m Vorkommen von E. E{,m} entspricht E{0,m}.
E{n,m}Erkennt mindestens n und höchstens m Vorkommen von E.

Um einen Quantor nicht nur auf das vorangehende Zeichen anzuwenden, gruppieren Sie Zeichen in einem Ausdruck mithilfe von Klammern. Beispielsweise findet „tag+“ ein „t“, gefolgt von einem „a“ und mindestens einem „g“, während „(tag)+“ mindestens ein Vorkommen von „tag“ findet.

Hinweis: Quantoren sind normalerweise „gierig“. Sie finden immer so viel Text wie möglich. Beispielsweise findet 0+ die erste Null, die sie finden, sowie alle darauf folgenden Nullen. Auf „20005“ angewendet, ergibt dies„20005“. Quantoren können nicht-gierig gemacht werden, siehe setMinimal().

Text erfassen

Klammern ermöglichen es uns, Elemente zu gruppieren, damit wir sie quantifizieren und erfassen können. Wenn wir beispielsweise den Ausdruck „mail|letter|correspondence“ haben, der mit einer Zeichenkette übereinstimmt, wissen wir, dass eines der Wörter übereinstimmt, aber nicht, welches. Durch die Verwendung von Klammern können wir alles „erfassen“, was innerhalb ihrer Grenzen übereinstimmt. Wenn wir also (mail|letter|correspondence) verwenden und diesen regulären Ausdruck mit der Zeichenkette „I sent you some email“ abgleichen, können wir die Funktionen cap() oder capturedTexts() verwenden, um die übereinstimmenden Zeichen zu extrahieren, in diesem Fall „mail“.

Wir können den erfassten Text innerhalb des regulären Ausdrucks selbst verwenden. Um auf den erfassten Text zu verweisen, verwenden wir Rückverweise, die wie bei ` cap()` ab 1 indiziert sind. Beispielsweise könnten wir mit „\b “ nach doppelten Wörtern in einer Zeichenkette suchen : (\w+)\W+\1\b . Das bedeutet, dass nach einer Wortgrenze gesucht wird, gefolgt von einem oder mehreren Wortzeichen, gefolgt von einem oder mehreren Nicht-Wortzeichen, gefolgt von demselben Text wie im ersten Ausdruck in Klammern, gefolgt von einer Wortgrenze.

Wenn wir Klammern ausschließlich zum Gruppieren und nicht zum Erfassen verwenden möchten, können wir die Syntax ohne Erfassung nutzen, z. B. (?:green|blue). Klammern ohne Erfassung beginnen mit „(?:“ und enden mit „)“. In diesem Beispiel suchen wir entweder nach „green“ oder „blue“, erfassen das Suchergebnis jedoch nicht, sodass wir nur wissen, ob ein Treffer vorliegt oder nicht, nicht aber, welche Farbe tatsächlich gefunden wurde. Die Verwendung von nicht-erfassenden Klammern ist effizienter als die Verwendung von erfassenden Klammern, da die Regexp-Engine weniger Verwaltungsaufwand betreiben muss.

Sowohl erfassende als auch nicht erfassende Klammern können verschachtelt werden.

Aus historischen Gründen sind Quantoren (z. B. *), die auf erfassende Klammern angewendet werden, „gieriger“ als andere Quantoren. Beispielsweise passt „a*(a*)“ auf „aaa“ mit `cap(1) == "aaa"`. Dieses Verhalten unterscheidet sich von dem anderer Regexp-Engines (insbesondere Perl). Um ein intuitiveres Erfassungsverhalten zu erzielen, geben Sie ` QRegExp::RegExp2 ` im QRegExp-Konstruktor an oder rufen Sie ` setPatternSyntax` auf (QRegExp::RegExp2).

Wenn die Anzahl der Übereinstimmungen nicht im Voraus bestimmt werden kann, ist es üblich, ` cap()` in einer Schleife zu verwenden. Zum Beispiel:

QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
    list << rx.cap(1);
    pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]

Aussagen

Assertions geben an der Stelle, an der sie im regulären Ausdruck vorkommen, eine Aussage über den Text ab, passen jedoch nicht auf bestimmte Zeichen. In der folgenden Liste steht E für einen beliebigen Ausdruck.

^Das Caret kennzeichnet den Anfang der Zeichenkette. Wenn Sie das Literal „ ^ “ abgleichen möchten, müssen Sie es durch „ \\^ “ escapen. Beispielsweise passt „^#include“ nur auf Zeichenketten, die mit den Zeichen „#include“ beginnen. (Wenn das Caret das erste Zeichen einer Zeichengruppe ist, hat es eine besondere Bedeutung, siehe Sets of Characters.)
$Das Dollarzeichen kennzeichnet das Ende der Zeichenkette. Beispielsweise passt „\d\s *$“ auf Zeichenketten, die mit einer Ziffer enden, auf die optional ein Leerzeichen folgen kann. Wenn Sie den wörtlichen Ausdruck „ $ “ finden möchten, müssen Sie ihn durch „ \\$ “ escapen.
\bEine Wortgrenze. Beispielsweise bedeutet der reguläre Ausdruck \bOK\b bedeutet, dass unmittelbar nach einer Wortgrenze (z. B. am Anfang einer Zeichenkette oder nach einem Leerzeichen) der Buchstabe „O“ und anschließend der Buchstabe „K“ unmittelbar vor einer weiteren Wortgrenze (z. B. am Ende einer Zeichenkette oder vor einem Leerzeichen) gefunden werden sollen. Beachten Sie jedoch, dass die Assertion tatsächlich kein Leerzeichen findet. Wenn wir also (\bOK\b ) schreiben und eine Übereinstimmung erhalten, enthält diese nur „OK“, selbst wenn die Zeichenkette „It’s OK now“ lautet.
\BEine Nicht-Wortgrenze. Diese Assertion ist wahr, wann immer \b falsch ist. Wenn wir beispielsweise nach \Bon\B in „Left on“, würde die Übereinstimmung fehlschlagen (Leerzeichen und das Ende der Zeichenkette sind keine Nicht-Wortgrenzen), in „tonne“würde sie jedoch übereinstimmen.
(?=E)Positives Lookahead. Diese Bedingung ist wahr, wenn der Ausdruck an dieser Stelle im regulären Ausdruck übereinstimmt. Beispielsweise passt const(?=\s+char) auf „const“, wann immer darauf „char“ folgt, wie in „static const char *“. (Vergleiche mit const\s+char, das auf „static const char *“ passt.)
(?!E)Negatives Lookahead. Diese Assertion ist wahr, wenn der Ausdruck an dieser Stelle im regulären Ausdruck nicht übereinstimmt. Beispielsweise passt „const(?!\s+char) “ auf „const“, außer wenn darauf „char“ folgt.

Platzhalter-Abgleich

Die meisten Befehlsshells wie bash oder cmd.exe unterstützen „File Globbing“, also die Möglichkeit, eine Gruppe von Dateien mithilfe von Platzhaltern zu identifizieren. Mit der Funktion setPatternSyntax() kann zwischen dem Regexp- und dem Platzhaltermodus gewechselt werden. Der Platzhalterabgleich ist wesentlich einfacher als vollständige reguläre Ausdrücke und verfügt nur über vier Funktionen:

cJedes Zeichen steht für sich selbst, mit Ausnahme der unten genannten. Somit entspricht „c“ dem Zeichen „c“.
?Stimmt mit einem beliebigen einzelnen Zeichen überein. Dies entspricht dem Zeichen „ .“ in vollständigen regulären Ausdrücken.
*Stimmt mit null oder mehr beliebigen Zeichen überein. Dies entspricht „.*“ in vollständigen regulären Ausdrücken.
[...]Zeichenmengen können in eckigen Klammern dargestellt werden, ähnlich wie in vollständigen regulären Ausdrücken. Innerhalb der Zeichenklasse hat der Backslash, genau wie außerhalb, keine besondere Bedeutung.

Im Modus „Wildcard“ können die Platzhalterzeichen nicht mit einem Escape-Zeichen versehen werden. Im Modus „ WildcardUnix “ dient das Zeichen „\“ als Escape-Zeichen für den Platzhalter.

Befinden wir uns beispielsweise im Wildcard-Modus und haben Zeichenfolgen, die Dateinamen enthalten, könnten wir HTML-Dateien mit *.html identifizieren. Dies entspricht null oder mehr Zeichen, gefolgt von einem Punkt und anschließend den Zeichen „h“, „t“, „m“ und „l“.

Um eine Zeichenkette anhand eines Platzhalterausdrucks zu prüfen, verwenden Sie ` exactMatch()`. Beispiel:

QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt");        // returns true
rx.exactMatch("welcome.txt.bak");   // returns false

Hinweise für Perl-Benutzer

Die meisten von Perl unterstützten Abkürzungen für Zeichenklassen werden auch von QRegExp unterstützt, siehe characters and abbreviations for sets of characters.

In QRegExp bedeutet „ ^ “ – außer innerhalb von Zeichenklassen – immer den Anfang der Zeichenkette, daher müssen Carets immer mit einem Escape-Zeichen versehen werden, sofern sie nicht zu diesem Zweck verwendet werden. In Perl ändert sich die Bedeutung des Carets automatisch je nach Kontext, sodass ein Escape-Zeichen selten erforderlich ist. Dasselbe gilt für „ $ “, das in QRegExp immer das Ende der Zeichenkette bedeutet.

Die Quantoren von QRegExp entsprechen den „greedy“-Quantoren von Perl (siehe jedoch „ note above “). Nicht-greedy-Abgleichen können nicht auf einzelne Quantoren angewendet werden, wohl aber auf alle Quantoren im Muster. Um beispielsweise den Perl-Regexp „ro+?m“ abzugleichen, ist Folgendes erforderlich:

QRegExp rx("ro+m");
rx.setMinimal(true);

Das Äquivalent zur Perl-Option „ /i “ ist „ setCaseSensitivity “ (Qt::CaseInsensitive).

Die Perl-Option „ /g “ lässt sich mithilfe von „ loop “ nachbilden.

In QRegExp steht „.“ für ein beliebiges Zeichen, daher verfügen alle QRegExp-Regulären Ausdrücke über eine Entsprechung zur Perl-Option „ /s “. QRegExp verfügt über keine Entsprechung zur Perl-Option „ /m “, dies lässt sich jedoch auf verschiedene Weise emulieren, beispielsweise durch Aufteilen der Eingabe in Zeilen oder durch eine Schleife mit einem regulären Ausdruck, der nach Zeilenumbrüchen sucht.

Da QRegExp zeichenfolgenorientiert ist, gibt es keine Assertions wie „ \A “, „ \Z “ oder „ \z “. Die Assertion „ \G “ wird nicht unterstützt, kann aber in einer Schleife nachgebildet werden.

Perls $& entspricht cap(0) oder capturedTexts()[0]. Es gibt keine QRegExp-Entsprechungen für $`, $' oder $+. Perls Erfassungsvariablen $1, $2, … entsprechen cap(1) oder capturedTexts()[1], cap(2) oder capturedTexts()[2] usw.

Um ein Muster zu ersetzen, verwenden Sie „ QString::replace “ ().

Die erweiterte Syntax von Perl für reguläre Ausdrücke ( /x ) wird nicht unterstützt, ebenso wenig wie Direktiven, z. B. (?i), oder Regexp-Kommentare, z. B. (?#comment). Andererseits können die Regeln von C++ für Literalzeichenfolgen verwendet werden, um dasselbe zu erreichen:

QRegExp mark("\\b"      // word boundary
              "[Mm]ark" // the word we want to match
            );

Sowohl positive als auch negative Lookahead-Prüfungen mit Nullbreite (?=Muster) und (?!Muster) werden mit derselben Syntax wie in Perl unterstützt. Perls Lookbehind-Prüfungen, „unabhängige“ Unterausdrücke und bedingte Ausdrücke werden nicht unterstützt.

Nicht-erfassende Klammern werden ebenfalls unterstützt, und zwar mit derselben Syntax (?:Muster).

Siehe QString::split() und QStringList::join() für Entsprechungen zu den Perl-Funktionen „split“ und „join“.

Hinweis: Da C++ \-Zeichen umwandelt, müssen diese im Code doppelt geschrieben werden, z. B. \b muss als \\b geschrieben werden.

Code-Beispiele

QRegExp rx("^\\d\\d?$");    // match integers 0 to 99
rx.indexIn("123");          // returns -1 (no match)
rx.indexIn("-6");           // returns -1 (no match)
rx.indexIn("6");            // returns 0 (matched at position 0)

Die dritte Zeichenkette stimmtmit „6“ überein. Dies ist ein einfacher regulärer Ausdruck zur Validierung von Ganzzahlen im Bereich von 0 bis 99.

QRegExp rx("^\\S+$");       // match strings without whitespace
rx.indexIn("Hello world");  // returns -1 (no match)
rx.indexIn("This_is-OK");   // returns 0 (matched at position 0)

Die zweite Zeichenfolge stimmt mit„This_is-OK“ überein. Wir haben die Zeichenabkürzung „\S “ (keine Leerzeichen) und die Anker verwendet, um Zeichenfolgen zu finden, die keine Leerzeichen enthalten.

Im folgenden Beispiel suchen wir nach Zeichenfolgen, die „mail“, „letter“ oder „correspondence“ enthalten, wobei jedoch nur ganze Wörter berücksichtigt werden, d. h. nicht „email“.

QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email");     // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 17

Die zweite Zeichenfolge passt auf „Bitte schreibe den Brief“. Das Wort „Brief“ wird ebenfalls erfasst (aufgrund der Klammern). So können wir sehen, welchen Text wir erfasst haben:

QString captured = rx.cap(1); // captured == "letter"

Dadurch wird der Text aus dem ersten Satz von Erfassungs-Klammern erfasst (wobei die linken Erfassungs-Klammern von links nach rechts gezählt werden). Die Klammern werden ab 1 gezählt, da cap(0) den gesamten übereinstimmenden regulären Ausdruck darstellt (entspricht in den meisten Regex-Engines dem Zeichen „&“).

QRegExp rx("&(?!amp;)");      // match ampersands but not &amp;
QString line1 = "This & that";
line1.replace(rx, "&amp;");
// line1 == "This &amp; that"
QString line2 = "His &amp; hers & theirs";
line2.replace(rx, "&amp;");
// line2 == "His &amp; hers &amp; theirs"

Hier haben wir das QRegExp an die replace()-Funktion von QString übergeben, um den übereinstimmenden Text durch neuen Text zu ersetzen.

QString str = "One Eric another Eirik, and an Ericsson. "
              "How many Eiriks, Eric?";
QRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik
int pos = 0;    // where we are in the string
int count = 0;  // how many Eric and Eirik's we've counted
while (pos >= 0) {
    pos = rx.indexIn(str, pos);
    if (pos >= 0) {
        ++pos;      // move along in str
        ++count;    // count our Eric or Eirik
    }
}

Wir haben die Funktion ` indexIn()` verwendet, um den regulären Ausdruck wiederholt in der Zeichenkette abzugleichen. Beachten Sie, dass wir, anstatt jeweils um ein Zeichen vorwärts zu gehen (` pos++ `), auch ` pos += rx.matchedLength() ` hätten schreiben können, um die bereits gefundene Zeichenkette zu überspringen. Die Anzahl entspricht dann 3, was dem Ausdruck „One Eric another Eirik, and an Ericsson. Wie viele Eiriks, Eric?'; „Ericsson“ oder „Eiriks“ werden nicht gefunden, da sie nicht von Nicht-Wortgrenzen umschlossen sind.

Eine häufige Anwendung von regulären Ausdrücken besteht darin, Zeilen mit durch Trennzeichen getrennten Daten in ihre einzelnen Felder aufzuteilen.

str = "The Qt Company Ltd\tqt.io\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
    company = rx.cap(1);
    web = rx.cap(2);
    country = rx.cap(3);
}

In diesem Beispiel haben unsere Eingabezeilen das Format „Firmenname, Webadresse und Land“. Leider ist der reguläre Ausdruck ziemlich lang und nicht sehr flexibel – der Code funktioniert nicht mehr, wenn wir weitere Felder hinzufügen. Eine einfachere und bessere Lösung besteht darin, nach dem Trennzeichen zu suchen – in diesem Fall „\t “ – und den umgebenden Text zu extrahieren. Die Funktion „ QString::split()“ kann eine Trennzeichenfolge oder einen regulären Ausdruck als Argument entgegennehmen und eine Zeichenkette entsprechend aufteilen.

QStringList field = str.split("\t");

Hier ist field[0] der Firmenname, field[1] die Webadresse und so weiter.

Um das Matching einer Shell nachzuahmen, können wir den Wildcard-Modus verwenden.

QRegExp rx("*.html");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("index.html");                // returns true
rx.exactMatch("default.htm");               // returns false
rx.exactMatch("readme.txt");                // returns false

Der Wildcard-Abgleich kann aufgrund seiner Einfachheit praktisch sein, aber jeder Wildcard-Regexp lässt sich auch mit vollständigen Regexps definieren, z. B. .*\.html$. Beachten Sie, dass wir mit einem Platzhalter nicht sowohl auf „ .html “- als auch auf „ .htm “-Dateien abgleichen können, es sei denn, wir verwenden „*.htm*“, was dann aber auch auf „test.html.bak“ zutrifft. Ein vollständiger regulärer Ausdruck bietet uns die benötigte Präzision: „.*\.html?$“.

QRegExp kann mit setCaseSensitivity() groß- und kleinschreibungsunabhängig abgleichen und nicht-gieriges Abgleichen verwenden, siehe setMinimal(). Standardmäßig verwendet QRegExp vollständige reguläre Ausdrücke, dies lässt sich jedoch mit setPatternSyntax() ändern. Die Suche kann vorwärts mit indexIn() oder rückwärts mit lastIndexIn() erfolgen. Auf erfasste Textteile kann mit „ capturedTexts “ () zugegriffen werden, was eine Zeichenfolgenliste aller erfassten Zeichenfolgen zurückgibt, oder mit „ cap “ (), was die erfasste Zeichenfolge für den angegebenen Index zurückgibt. Die Funktion „ pos “ () nimmt einen Übereinstimmungsindex entgegen und gibt die Position in der Zeichenfolge zurück, an der die Übereinstimmung gefunden wurde (oder -1, falls keine Übereinstimmung vorlag).

Portierung auf QRegularExpression

Die in Qt 5 eingeführte Klasse „ QRegularExpression “ implementiert Perl-kompatible reguläre Ausdrücke und stellt hinsichtlich der angebotenen APIs, der unterstützten Mustersyntax und der Ausführungsgeschwindigkeit eine erhebliche Verbesserung gegenüber QRegExp dar. Der größte Unterschied besteht darin, dass ` QRegularExpression ` lediglich einen regulären Ausdruck enthält und bei einer Übereinstimmungsanfrage nicht verändert wird. Stattdessen wird ein ` QRegularExpressionMatch `-Objekt zurückgegeben, um das Ergebnis einer Übereinstimmung zu überprüfen und die erfasste Teilzeichenfolge zu extrahieren. Dasselbe gilt für globale Übereinstimmungen und ` QRegularExpressionMatchIterator`.

Weitere Unterschiede werden im Folgenden beschrieben.

Hinweis: „ QRegularExpression “ unterstützt nicht alle Funktionen, die in Perl-kompatiblen regulären Ausdrücken verfügbar sind. Am auffälligsten ist dabei, dass doppelte Namen für Erfassungsgruppen nicht unterstützt werden und deren Verwendung zu undefiniertem Verhalten führen kann. Dies kann sich in einer zukünftigen Version von Qt XML ändern.

Unterschiedliche Mustersyntax

Die Portierung eines regulären Ausdrucks von QRegExp nach QRegularExpression erfordert möglicherweise Änderungen am Muster selbst.

In bestimmten Szenarien war QRegExp zu nachsichtig und akzeptierte Muster, die bei der Verwendung von „ QRegularExpression “ schlichtweg ungültig sind. Diese lassen sich leicht erkennen, da die mit diesen Mustern erstellten „ QRegularExpression “-Objekte ungültig sind (siehe QRegularExpression::isValid()).

In anderen Fällen kann sich die Semantik eines von QRegExp nach ` QRegularExpression ` portierten Musters unbemerkt ändern. Daher ist es notwendig, die verwendeten Muster zu überprüfen. Die auffälligsten Fälle von stillschweigender Inkompatibilität sind:

  • Für die Verwendung eines hexadezimalen Escape-Zeichens wie \xHHHH mit mehr als zwei Ziffern sind geschweifte Klammern erforderlich. Ein Muster wie \x2022 muss in \x{2022} portiert werden, da es sonst mit einem Leerzeichen (0x20) gefolgt von der Zeichenkette "22" übereinstimmt. Generell wird dringend empfohlen, beim Escape-Zeichen \x stets geschweifte Klammern zu verwenden, unabhängig von der Anzahl der angegebenen Ziffern.
  • Eine 0-bis-n-Quantifizierung wie „ {,n} “ muss in „ {0,n} “ umgewandelt werden, um die Semantik beizubehalten. Andernfalls würde ein Muster wie „ \d{,3} “ auf eine Ziffer gefolgt von genau der Zeichenfolge „ "{,3}" “ passen.
  • QRegExp führt standardmäßig eine Unicode-bewusste Übereinstimmungssuche durch, während QRegularExpression eine separate Option erfordert; weitere Details finden Sie weiter unten.
  • c{.} in QRegExp passt standardmäßig auf alle Zeichen, einschließlich des Zeilenumbruchzeichens. QRegularExpression schließt das Zeilenumbruchzeichen standardmäßig aus. Um das Zeilenumbruchzeichen einzubeziehen, setzen Sie die Musteroption „ QRegularExpression::DotMatchesEverythingOption “.

Einen Überblick über die von QRegularExpression unterstützte Syntax für reguläre Ausdrücke finden Sie in der Manpage pcrepattern(3), in der die von PCRE (der Referenzimplementierung für Perl-kompatible reguläre Ausdrücke) unterstützte Mustersyntax beschrieben wird.

Portierung von QRegExp::exactMatch()

QRegExp::exactMatch() erfüllte zwei Zwecke: Es führte einen exakten Abgleich eines regulären Ausdrucks mit einer Zielzeichenfolge durch und implementierte den partiellen Abgleich.

Portierung aus dem exakten Abgleich von QRegExp

Der exakte Abgleich gibt an, ob der reguläre Ausdruck mit der gesamten Zielzeichenfolge übereinstimmt. Beispielsweise liefern die Klassen für die Zielzeichenfolge „ "abc123" “ folgende Ergebnisse:

QRegExp::exactMatch()QRegularExpressionMatch::hasMatch()
"\\d+"falsetrue
"[a-z]+\\d+"wahrtrue

Eine exakte Übereinstimmung wird in ` QRegularExpression` nicht berücksichtigt. Wenn Sie sicherstellen möchten, dass die Suchzeichenfolge exakt mit dem regulären Ausdruck übereinstimmt, können Sie das Muster mit der Funktion ` QRegularExpression::anchoredPattern()` umschließen:

QString p("a .*|pattern");

// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));
Portierung aus dem Bereich „Partial Matching“ von QRegExp

Bei der Verwendung von ` QRegExp::exactMatch()` kann man, falls keine exakte Übereinstimmung gefunden wurde, dennoch herausfinden, wie viel der Suchzeichenfolge durch den regulären Ausdruck abgedeckt wurde, indem man ` QRegExp::matchedLength()` aufruft. Wenn die zurückgegebene Länge der Länge der Suchzeichenfolge entspricht, kann man daraus schließen, dass eine teilweise Übereinstimmung gefunden wurde.

QRegularExpression unterstützt das partielle Abgleichen explizit mithilfe des entsprechenden QRegularExpression::MatchType.

Globale Übereinstimmung

Aufgrund von Einschränkungen der QRegExp-API war es nicht möglich, den globalen Abgleich korrekt zu implementieren (d. h. so wie es Perl tut). Insbesondere sind Muster, die 0 Zeichen abgleichen können (wie "a*"), problematisch.

QRegularExpression::globalMatch() implementiert den globalen Abgleich nach Perl korrekt, und der zurückgegebene Iterator kann verwendet werden, um jedes Ergebnis zu untersuchen.

Wenn Sie beispielsweise folgenden Code haben:

QString subject("the quick fox");

int offset = 0;
QRegExp re("(\\w+)");
while ((offset = re.indexIn(subject, offset)) != -1) {
    offset += re.matchedLength();
    // ...
}

können Sie ihn wie folgt umschreiben:

QString subject("the quick fox");

QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    // ...
}
Unterstützung von Unicode-Eigenschaften

Bei der Verwendung von QRegExp finden Zeichenklassen wie \w, \d usw. Zeichen mit der entsprechenden Unicode-Eigenschaft: So passt beispielsweise \d auf jedes Zeichen mit der Unicode-Eigenschaft „ Nd “ (Dezimalziffer).

Diese Zeichenklassen finden standardmäßig nur Übereinstimmungen mit ASCII-Zeichen, wenn „ QRegularExpression “ verwendet wird: So findet beispielsweise „ \d “ genau ein Zeichen im ASCII-Bereich „ 0-9 “. Dieses Verhalten lässt sich durch die Verwendung der Musteroption „ QRegularExpression::UseUnicodePropertiesOption “ ändern.

Platzhalterabgleich

Es gibt in „ QRegularExpression “ keine direkte Möglichkeit, Platzhalterabgleiche durchzuführen. Es steht jedoch die Methode ` QRegularExpression::wildcardToRegularExpression()` zur Verfügung, um „glob“-Muster in einen Perl-kompatiblen regulären Ausdruck zu übersetzen, der für diesen Zweck verwendet werden kann.

Wenn Sie beispielsweise folgenden Code haben:

QRegExp wildcard("*.txt");
wildcard.setPatternSyntax(QRegExp::Wildcard);

können Sie ihn wie folgt umschreiben:

auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));

Bitte beachten Sie jedoch, dass einige Shell-ähnliche Platzhaltermuster möglicherweise nicht wie erwartet übersetzt werden. Der folgende Beispielcode führt zu einem stillen Fehler, wenn er einfach mit der oben genannten Funktion konvertiert wird:

const QString fp1("C:/Users/dummy/files/content.txt");
const QString fp2("/home/dummy/files/content.txt");

QRegExp re1("*/files/*");
re1.setPatternSyntax(QRegExp::Wildcard);
re1.exactMatch(fp1); // returns true
re1.exactMatch(fp2); // returns true

// but converted with QRegularExpression::wildcardToRegularExpression()

QRegularExpression re2(QRegularExpression::wildcardToRegularExpression("*/files/*"));
re2.match(fp1).hasMatch(); // returns false
re2.match(fp2).hasMatch(); // returns false

Dies liegt daran, dass der von ` QRegularExpression::wildcardToRegularExpression()` zurückgegebene reguläre Ausdruck standardmäßig vollständig verankert ist. Um einen regulären Ausdruck zu erhalten, der nicht verankert ist, übergeben Sie ` QRegularExpression::UnanchoredWildcardConversion ` als Konvertierungsoptionen:

QRegularExpression re3(QRegularExpression::wildcardToRegularExpression(
                           "*/files/*", QRegularExpression::UnanchoredWildcardConversion));
re3.match(fp1).hasMatch(); // returns true
re3.match(fp2).hasMatch(); // returns true
Minimale Übereinstimmung

QRegExp::setMinimal() implementierte minimale Übereinstimmung, indem es einfach die „Gier“ der Quantoren umkehrte (QRegExp unterstützte keine „lazy“-Quantoren wie *?, +? usw.). QRegularExpression unterstützt hingegen „greedy“, „lazy“ und „possessive“ Quantoren. Die Musteroption „ QRegularExpression::InvertedGreedinessOption “ kann nützlich sein, um die Effekte von ` QRegExp::setMinimal()` nachzubilden: Wenn sie aktiviert ist, kehrt sie die „Gier“ der Quantoren um (gierige werden zu „lazy“ und umgekehrt).

Caret-Modi

Die Abgleichoption „ QRegularExpression::AnchorAtOffsetMatchOption “ kann verwendet werden, um das Verhalten von „ QRegExp::CaretAtOffset “ nachzubilden. Für die anderen „ QRegExp::CaretMode “-Modi gibt es keine Entsprechung.

Siehe auch „ QString “, „ QStringList “ und „ QSortFilterProxyModel “.

Dokumentation zu Mitgliedstypen

enum QRegExp::CaretMode

Die Enumeration „CaretMode“ definiert die verschiedenen Bedeutungen des Caret-Zeichens (^) in einem regulären Ausdruck. Die möglichen Werte sind:

KonstanteWertBeschreibung
QRegExp::CaretAtZero0Das Caret entspricht dem Index 0 in der durchsuchten Zeichenkette.
QRegExp::CaretAtOffset1Das Caret entspricht dem Start-Offset der Suche.
QRegExp::CaretWontMatch2Das Caret passt niemals.

enum QRegExp::PatternSyntax

Die Syntax, die zur Interpretation der Bedeutung des Musters verwendet wird.

KonstanteWertBeschreibung
QRegExp::RegExp0Eine umfangreiche, Perl-ähnliche Syntax für den Musterabgleich. Dies ist die Standardeinstellung.
QRegExp::RegExp23Ähnlich wie RegExp, jedoch mit „ greedy quantifiers “. (Eingeführt in Qt 4.2.)
QRegExp::Wildcard1Dies bietet eine einfache Syntax für die Mustererkennung, ähnlich derjenigen, die von Shells (Befehlsinterpretern) für „File Globbing“ verwendet wird. Siehe QRegExp wildcard matching.
QRegExp::WildcardUnix4Dies ähnelt „Wildcard“, verhält sich jedoch wie eine Unix-Shell. Die Platzhalterzeichen können mit dem Zeichen „\“ maskiert werden.
QRegExp::FixedString2Das Muster ist eine feste Zeichenkette. Dies entspricht der Anwendung des RegExp-Musters auf eine Zeichenkette, in der alle Metazeichen mit escape() maskiert sind.
QRegExp::W3CXmlSchema115Das Muster ist ein regulärer Ausdruck gemäß der W3C-Spezifikation „XML Schema 1.1“.

Siehe auch ` setPatternSyntax()`.

Dokumentation zu den Member-Funktionen

QRegExp::QRegExp()

Erstellt einen leeren regulären Ausdruck.

Siehe auch isValid() und errorString().

[explicit] QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)

Erstellt ein Objekt für einen regulären Ausdruck für die angegebene Zeichenkette „ pattern “. Das Muster muss in Wildcard-Notation angegeben werden, sofern „ syntax “ auf „ Wildcard “ gesetzt ist; die Standardeinstellung ist „ RegExp “. Bei der Mustererkennung wird die Groß-/Kleinschreibung beachtet, es sei denn, „ cs “ ist auf „ Qt::CaseInsensitive “ gesetzt. Die Übereinstimmungssuche erfolgt gierig (maximal), kann jedoch durch Aufruf von „ setMinimal()“ geändert werden.

Siehe auch setPattern(), setCaseSensitivity() und setPatternSyntax().

QRegExp::QRegExp(const QRegExp &rx)

Erstellt einen regulären Ausdruck als Kopie von rx.

Siehe auch operator=().

[noexcept] QRegExp::~QRegExp()

Löscht den regulären Ausdruck und bereinigt dessen interne Daten.

QString QRegExp::cap(int nth = 0) const

Gibt den Text zurück, der durch die Unterausdrücke „ nth “ erfasst wurde. Die gesamte Übereinstimmung hat den Index 0, und die in Klammern gesetzten Unterausdrücke haben Indizes ab 1 (mit Ausnahme von Klammern ohne Erfassung).

QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
    QString value = rxlen.cap(1); // "189"
    QString unit = rxlen.cap(2);  // "cm"
    // ...
}

Die Reihenfolge der von `cap()` erfassten Elemente ist wie folgt: Das erste Element, `cap(0)`, ist die gesamte übereinstimmende Zeichenfolge. Jedes nachfolgende Element entspricht der nächsten erfassenden linken Klammer. Somit ist `cap(1)` der Text der ersten erfassenden Klammer, `cap(2)` der Text der zweiten und so weiter.

Siehe auch capturedTexts() und pos().

int QRegExp::captureCount() const

Gibt die Anzahl der im regulären Ausdruck enthaltenen Erfassungen zurück.

QStringList QRegExp::capturedTexts() const

Gibt eine Liste der erfassten Textzeichenfolgen zurück.

Die erste Zeichenkette in der Liste ist die gesamte übereinstimmende Zeichenkette. Jedes nachfolgende Listenelement enthält eine Zeichenkette, die mit einem (erfassenden) Teilausdruck des regulären Ausdrucks übereinstimmt.

Beispiel:

QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", " ", "inches", "es")

Das obige Beispiel erfasst auch Elemente, die zwar vorhanden sein können, an denen wir aber kein Interesse haben. Dieses Problem lässt sich durch die Verwendung von nicht-erfassenden Klammern lösen:

QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", "inches")

Beachten Sie, dass Sie, wenn Sie die Liste durchlaufen möchten, eine Kopie durchlaufen sollten, z. B.

QStringList list = rx.capturedTexts();
QStringList::iterator it = list.begin();
while (it != list.end()) {
    myProcessing(*it);
    ++it;
}

Manche regulären Ausdrücke können eine unbestimmte Anzahl von Übereinstimmungen liefern. Wenn die Eingabezeichenfolge beispielsweise „Offsets: 12 14 99 231 7“ lautet und der reguläre Ausdruck „ rx “ die Form „(\d+)“ hat, würden wir erwarten, eine Liste aller gefundenen Zahlen zu erhalten. Nach dem Aufruf von „ rx.indexIn(str) “ gibt „capturedTexts()“ jedoch die Liste („12“, „12“) zurück, d. h., die gesamte Übereinstimmung war „12“ und der erste übereinstimmende Teilausdruck war „12“. Der richtige Ansatz besteht darin, „ cap()“ in einem „ loop “ zu verwenden.

Die Reihenfolge der Elemente in der Zeichenfolgenliste ist wie folgt: Das erste Element ist die gesamte übereinstimmende Zeichenfolge. Jedes nachfolgende Element entspricht der nächsten erfassten linken Klammer. Somit ist `capturedTexts()`[1] der Text der ersten erfassten Klammer, `capturedTexts()`[2] der Text der zweiten und so weiter (entsprechend $1, $2 usw. in einigen anderen Regex-Sprachen).

Siehe auch ` cap()` und ` pos()`.

Qt::CaseSensitivity QRegExp::caseSensitivity() const

Gibt „ Qt::CaseSensitive “ zurück, wenn der reguläre Ausdruck unter Berücksichtigung der Groß-/Kleinschreibung übereinstimmt; andernfalls wird „ Qt::CaseInsensitive “ zurückgegeben.

Siehe auch setCaseSensitivity(), patternSyntax(), pattern() und isMinimal().

int QRegExp::countIn(const QString &str) const

Gibt die Anzahl der Treffer dieses regulären Ausdrucks in „ str “ zurück.

Siehe auch indexIn(), lastIndexIn() und replaceIn().

QString QRegExp::errorString() const

Gibt eine Textzeichenfolge zurück, die erklärt, warum ein Regexp-Muster ungültig ist; andernfalls wird „Es ist kein Fehler aufgetreten“ zurückgegeben.

Siehe auch isValid().

[static] QString QRegExp::escape(const QString &str)

Gibt die Zeichenkette „ str “ zurück, wobei jedes Sonderzeichen für reguläre Ausdrücke mit einem Backslash maskiert ist. Die Sonderzeichen sind $, (,), *, +, ., ?, [, ,], ^, {, | und }.

Beispiel:

s1 = QRegExp::escape("bingo");   // s1 == "bingo"
s2 = QRegExp::escape("f(x)");    // s2 == "f\\(x\\)"

Diese Funktion ist nützlich, um reguläre Ausdrücke dynamisch zu erstellen:

QRegExp rx("(" + QRegExp::escape(name) +
           "|" + QRegExp::escape(alias) + ")");

Siehe auch setPatternSyntax().

bool QRegExp::exactMatch(const QString &str) const

Gibt „ true “ zurück, wenn „ str “ exakt mit diesem regulären Ausdruck übereinstimmt; andernfalls wird „ false “ zurückgegeben. Sie können feststellen, wie viel von der Zeichenkette übereinstimmt, indem Sie „ matchedLength()“ aufrufen.

Für eine gegebene Regexp-Zeichenkette R entspricht exactMatch("R") dem Ausdruck indexIn("^R$"), da exactMatch() den Regexp-Ausdruck effektiv in die Anker am Anfang und am Ende der Zeichenkette einschließt, mit dem Unterschied, dass matchedLength() anders gesetzt wird.

Wenn der reguläre Ausdruck beispielsweise „blue“ lautet, gibt exactMatch() „ true “ nur für die Eingabe „ blue “ zurück. Für die Eingaben „ bluebell “, „ blutak “ und „ lightblue “ gibt exactMatch() „ false “ zurück, und „ matchedLength()“ liefert jeweils 4, 3 und 0.

Obwohl diese Funktion als `const` deklariert ist, setzt sie ` matchedLength()`, ` capturedTexts()` und ` pos()`.

Siehe auch indexIn() und lastIndexIn().

QStringList QRegExp::filterList(const QStringList &stringList) const

Gibt eine Liste aller Zeichenfolgen zurück, die diesem regulären Ausdruck in stringList entsprechen.

int QRegExp::indexIn(const QStringList &list, int from) const

Gibt die Indexposition der ersten exakten Übereinstimmung dieses regulären Ausdrucks in „ list “ zurück, wobei die Suche ab der Indexposition „ from “ vorwärts erfolgt. Gibt -1 zurück, wenn kein Eintrag übereinstimmt.

Siehe auch lastIndexIn() und exactMatch().

int QRegExp::indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const

Versucht, in „ str “ ab der Position „ offset “ (Standardwert: 0) nach einer Übereinstimmung zu suchen. Ist „ offset “ gleich -1, beginnt die Suche beim letzten Zeichen; bei -2 beim vorletzten Zeichen usw.

Gibt die Position der ersten Übereinstimmung zurück oder -1, wenn keine Übereinstimmung gefunden wurde.

Mit dem Parameter „ caretMode “ kann festgelegt werden, ob „^“ am Index 0 oder an der Position „ offset “ übereinstimmen soll.

Möglicherweise bevorzugen Sie die Verwendung von ` QString::indexOf()`, ` QString::contains()` oder sogar ` QStringList::filter()`. Um Übereinstimmungen zu ersetzen, verwenden Sie ` QString::replace()`.

Beispiel:

QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+");    // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
    ++count;
    pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4

Obwohl diese Funktion „const“ ist, setzt sie matchedLength(), capturedTexts() und pos().

Wenn der „ QRegExp “ ein Platzhalterausdruck ist (siehe setPatternSyntax()) und Sie eine Zeichenkette anhand des gesamten Platzhalterausdrucks prüfen möchten, verwenden Sie exactMatch() anstelle dieser Funktion.

Siehe auch „ lastIndexIn()“ und „ exactMatch()“.

bool QRegExp::isEmpty() const

Gibt „ true “ zurück, wenn die Musterzeichenfolge leer ist; andernfalls wird „false“ zurückgegeben.

Wenn Sie ` exactMatch()` mit einem leeren Muster auf eine leere Zeichenkette anwenden, wird `true` zurückgegeben; andernfalls wird ` false ` zurückgegeben, da die Funktion auf die gesamte Zeichenkette angewendet wird. Wenn Sie ` indexIn()` mit einem leeren Muster auf eine beliebige Zeichenkette anwenden, wird der Start-Offset (standardmäßig 0) zurückgegeben, da das leere Muster mit der „Leere“ am Anfang der Zeichenkette übereinstimmt. In diesem Fall beträgt die von ` matchedLength()` zurückgegebene Länge der Übereinstimmung 0.

Siehe QString::isEmpty().

bool QRegExp::isMinimal() const

Gibt „ true “ zurück, wenn die minimale (nicht-gierige) Übereinstimmung aktiviert ist; andernfalls wird „ false “ zurückgegeben.

Siehe auch caseSensitivity() und setMinimal().

bool QRegExp::isValid() const

Gibt „ true “ zurück, wenn der reguläre Ausdruck gültig ist; andernfalls wird „false“ zurückgegeben. Ein ungültiger regulärer Ausdruck liefert niemals eine Übereinstimmung.

Das Muster [a-z] ist ein Beispiel für ein ungültiges Muster, da die schließende eckige Klammer fehlt.

Beachten Sie, dass die Gültigkeit eines regulären Ausdrucks auch von der Einstellung des Platzhalter-Flags abhängen kann; beispielsweise ist *.html ein gültiger regulärer Ausdruck mit Platzhaltern, aber ein ungültiger vollständiger regulärer Ausdruck.

Siehe auch errorString().

int QRegExp::lastIndexIn(const QStringList &list, int from) const

Gibt die Indexposition der letzten exakten Übereinstimmung dieses regulären Ausdrucks in ` list` zurück, wobei die Suche rückwärts ab der Indexposition ` from` erfolgt. Ist ` from ` gleich -1 (Standardwert), beginnt die Suche am letzten Element. Gibt -1 zurück, wenn kein Element übereinstimmt.

Siehe auch ` QRegExp::exactMatch()` ().

int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const

Versucht, in „ str “ ab der Position „ offset “ rückwärts nach einer Übereinstimmung zu suchen. Ist „ offset “ gleich -1 (Standardwert), beginnt die Suche beim letzten Zeichen; bei -2 beim vorletzten Zeichen usw.

Gibt die Position der ersten Übereinstimmung zurück oder -1, falls keine Übereinstimmung gefunden wurde.

Mit dem Parameter ` caretMode ` kann festgelegt werden, ob `^` am Index 0 oder an der Position ` offset` übereinstimmen soll.

Obwohl es sich um eine `const`-Funktion handelt, setzt diese Funktion ` matchedLength()`, ` capturedTexts()` und ` pos()`.

Warnung: Die Rückwärtssuche ist wesentlich langsamer als die Vorwärtssuche.

Siehe auch indexIn() und exactMatch().

int QRegExp::matchedLength() const

Gibt die Länge der zuletzt gefundenen Übereinstimmung zurück oder -1, wenn keine Übereinstimmung gefunden wurde.

Siehe auch exactMatch(), indexIn() und lastIndexIn().

QString QRegExp::pattern() const

Gibt die Musterzeichenfolge des regulären Ausdrucks zurück. Das Muster hat entweder die Syntax für reguläre Ausdrücke oder die Platzhaltersyntax, abhängig von patternSyntax().

Siehe auch setPattern(), patternSyntax() und caseSensitivity().

QRegExp::PatternSyntax QRegExp::patternSyntax() const

Gibt die vom regulären Ausdruck verwendete Syntax zurück. Der Standardwert ist „ QRegExp::RegExp “.

Siehe auch setPatternSyntax(), pattern() und caseSensitivity().

int QRegExp::pos(int nth = 0) const

Gibt die Position des mit ` nth ` erfassten Textes in der durchsuchten Zeichenkette zurück. Ist ` nth ` gleich 0 (Standardwert), gibt `pos()` die Position der gesamten Übereinstimmung zurück.

Beispiel:

QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null");   // returns 7 (position of /dev/null)
rx.pos(0);                        // returns 7 (position of /dev/null)
rx.pos(1);                        // returns 8 (position of dev)
rx.pos(2);                        // returns 12 (position of null)

Bei Übereinstimmungen der Länge Null gibt pos() immer -1 zurück. (Wenn beispielsweise cap(4) eine leere Zeichenkette zurückgeben würde, gibt pos(4) -1 zurück.) Dies ist eine Besonderheit der Implementierung.

Siehe auch „ cap()“ und „ capturedTexts()“.

QString QRegExp::removeIn(const QString &str) const

Entfernt alle Vorkommen dieses regulären Ausdrucks str und gibt das Ergebnis zurück

Führt dasselbe aus wie ` replaceIn(str, QString())`.

Siehe auch indexIn(), lastIndexIn() und replaceIn().

QString QRegExp::replaceIn(const QString &str, const QString &after) const

Ersetzt jedes Vorkommen dieses regulären Ausdrucks in „ str “ durch „ after “ und gibt das Ergebnis zurück.

Bei regulären Ausdrücken, die „ capturing parentheses “ enthalten, werden Vorkommen von \1, \2, ... in „ after “ werden durch „ rx “ ersetzt. cap(1), cap(2), ...

Siehe auch indexIn(), lastIndexIn() und QRegExp::cap().

QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const

Ersetzt jedes Vorkommen dieses regulären Ausdrucks in jedem Element von stringList durch after. Gibt eine Referenz auf die Zeichenfolgenliste zurück.

void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)

Legt die Groß-/Kleinschreibung bei der Übereinstimmungssuche auf „ cs “ fest.

Wenn „ cs “ auf „ Qt::CaseSensitive “ gesetzt ist, passt „\.txt$“ zu „ readme.txt “, jedoch nicht zu „ README.TXT “.

Siehe auch „ caseSensitivity()“, „ setPatternSyntax()“, „ setPattern()“ und „ setMinimal()“.

void QRegExp::setMinimal(bool minimal)

Aktiviert oder deaktiviert die minimale Übereinstimmung. Wenn „ minimal “ auf „false“ gesetzt ist, erfolgt die Übereinstimmung „greedy“ (maximal), was der Standard ist.

Nehmen wir zum Beispiel an, wir hätten die Eingabezeichenfolge „We must be <b>bold</b>, very <b>bold</b>!“ und das Muster <b>.*</b>. Bei der standardmäßigen gierigen (maximalen) Übereinstimmung lautet das Ergebnis „We must be <b>bold</b>, very <b>bold</b>!“. Bei minimalem (nicht-gierigem) Abgleich lautet das erste Übereinstimmungsergebnis jedoch: „We must be <b>bold</b>, very <b>bold</b>!“ und das zweite Übereinstimmungsergebnis lautet: „We must be <b>bold</b>, very <b>bold</b>!“. In der Praxis würden wir stattdessen vielleicht das Muster <b>[^<]*</b> verwenden, obwohl dies bei verschachtelten Tags immer noch fehlschlagen würde.

Siehe auch isMinimal() und setCaseSensitivity().

void QRegExp::setPattern(const QString &pattern)

Setzt die Musterzeichenfolge auf „ pattern “. Die Optionen zur Groß-/Kleinschreibung, zu Platzhaltern und zur minimalen Übereinstimmung werden nicht geändert.

Siehe auch pattern(), setPatternSyntax() und setCaseSensitivity().

void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)

Legt den Syntaxmodus für den regulären Ausdruck fest. Die Standardeinstellung ist „ QRegExp::RegExp “.

Die Einstellung von „ syntax “ auf „ QRegExp::Wildcard “ aktiviert die einfache, shellähnliche Syntax „ QRegExp wildcard matching “. Beispielsweise passt „r*.txt“ im Platzhaltermodus auf die Zeichenfolge „ readme.txt “, nicht jedoch auf „ readme “.

Wird ` syntax ` auf ` QRegExp::FixedString ` gesetzt, wird das Muster als einfache Zeichenkette interpretiert. Sonderzeichen (z. B. Backslash) müssen dann nicht mit Escape-Zeichen versehen werden.

Siehe auch patternSyntax(), setPattern(), setCaseSensitivity() und escape().

QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const

Teilt „ str “ an allen Stellen, an denen dieser reguläre Ausdruck übereinstimmt, in Teilzeichenfolgen auf und gibt die Liste dieser Zeichenfolgen zurück. Wenn dieser reguläre Ausdruck an keiner Stelle in der Zeichenfolge übereinstimmt, gibt split() eine Liste mit einem einzigen Element zurück, die „ str “ enthält.

Wenn behavior auf Qt::KeepEmptyParts gesetzt ist, werden leere Felder in die resultierende Liste aufgenommen.

Siehe auch „ QStringList::join()“ und „ QString::split()“.

[noexcept] void QRegExp::swap(QRegExp &other)

Ersetzt den regulären Ausdruck „ other “ durch diesen regulären Ausdruck. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.

QRegExp::operator QVariant() const

Gibt den regulären Ausdruck als QVariant

bool QRegExp::operator!=(const QRegExp &rx) const

Gibt „ true “ zurück, wenn dieser reguläre Ausdruck nicht mit „ rx “ übereinstimmt; andernfalls wird „ false “ zurückgegeben.

Siehe auch operator==().

[noexcept] QRegExp &QRegExp::operator=(QRegExp &&other)

Weist „ other “ dieser „ QRegExp “-Instanz zu.

QRegExp &QRegExp::operator=(const QRegExp &rx)

Kopiert den regulären Ausdruck rx und gibt eine Referenz auf die Kopie zurück. Die Optionen zur Groß-/Kleinschreibung, zu Platzhaltern und zur minimalen Übereinstimmung werden ebenfalls kopiert.

bool QRegExp::operator==(const QRegExp &rx) const

Gibt ` true ` zurück, wenn dieser reguläre Ausdruck mit ` rx` übereinstimmt; andernfalls wird ` false` zurückgegeben.

Zwei „ QRegExp “-Objekte sind gleich, wenn sie dieselben Musterzeichenfolgen und dieselben Einstellungen für Groß-/Kleinschreibung, Platzhalter und minimale Übereinstimmung aufweisen.

Verwandte Nicht-Mitglieder

[noexcept] size_t qHash(const QRegExp &key, size_t seed = 0)

Gibt den Hash-Wert für „ key “ zurück, wobei „ seed “ als Startwert für die Berechnung verwendet wird.

QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)

Schreibt den regulären Ausdruck „ regExp “ in den Stream „ out “.

Siehe auch „Serialisierung vonQt-Datentypen“.

QDataStream &operator>>(QDataStream &in, QRegExp &regExp)

Liest einen regulären Ausdruck aus dem Stream „ in “ in „ regExp “ ein.

Siehe auch „Serialisierung vonQt-Datentypen“.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.