QRegExp Class

Die Klasse QRegExp ermöglicht den Mustervergleich mit regulären Ausdrücken. Mehr...

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

Hinweis: Alle Funktionen in 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)
QVariant 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)

Detaillierte Beschreibung

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

Ein regulärer Ausdruck, oder "regexp", ist ein Muster für den Abgleich von Teilstrings in einem Text. Dies ist in vielen Kontexten nützlich, z.B.,

GültigkeitsprüfungEin regexp kann prüfen, ob eine Teilzeichenkette bestimmte Kriterien erfüllt, z. B. ob sie eine ganze Zahl ist oder keine Leerzeichen enthält.
DurchsuchenEin regexp bietet einen leistungsfähigeren Mustervergleich als einen einfachen Teilstringvergleich, z. B. einen Vergleich mit einem der Wörter mail, letter oder correspondence, aber keinem der Wörter email, mailman, mailer, letterbox usw.
Suchen und ErsetzenEine Regexp kann alle Vorkommen einer Teilzeichenkette durch eine andere Teilzeichenkette ersetzen, z. B. alle Vorkommen von & durch &amp; ersetzen, außer wenn auf & bereits ein amp; folgt.
Aufteilung von ZeichenkettenEin regexp kann verwendet werden, um festzustellen, wo eine Zeichenkette aufgespalten werden soll, z. B. beim Aufspalten tabulatorgetrennter Zeichenketten.

Es folgt eine kurze Einführung in Regexps, eine Beschreibung der Regexp-Sprache von Qt, einige Beispiele und die Dokumentation der Funktion selbst. QRegExp ist der Regexp-Sprache von Perl nachempfunden. Sie unterstützt Unicode vollständig. QRegExp kann auch in einem einfacheren Wildcard-Modus verwendet werden, der der Funktionalität von Befehlsshells ähnlich ist. 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 zu übereinstimmende Muster als einfache Zeichenkette interpretiert wird, d.h. Sonderzeichen (z.B. Backslash) werden nicht escaped.

Ein guter Text über Regexps ist Mastering Regular Expressions (Third Edition) von Jeffrey E. F. Friedl, ISBN 0-596-52812-4.

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

Einführung

Regexps sind aus Ausdrücken, Quantifizierern und Assertions aufgebaut. Der einfachste Ausdruck ist ein Zeichen, z.B. x oder 5. Ein Ausdruck kann auch aus einer Reihe von Zeichen bestehen, die in eckige Klammern eingeschlossen sind. [ABCD] passt auf ein A oder ein B oder ein C oder ein D. Wir können denselben Ausdruck als [A-D] schreiben, und ein Ausdruck, der auf jeden Großbuchstaben des englischen Alphabets passt, wird als [A-Z] geschrieben.

Ein Quantifizierer gibt die Anzahl der Vorkommen eines Ausdrucks an, die übereinstimmen müssen. x{1,1} bedeutet, dass nur ein einziges x übereinstimmt. x{1,5} bedeutet, dass eine Folge von x Zeichen übereinstimmt, die mindestens ein x aber nicht mehr als fünf enthält.

Beachten Sie, dass regexps im Allgemeinen nicht verwendet werden können, um auf ausgeglichene Klammern oder Tags zu prüfen. Beispielsweise kann ein Regexp so geschrieben werden, dass er mit einem öffnenden html <b> und seinem schließenden </b> übereinstimmt, wenn die <b> Tags nicht verschachtelt sind, aber wenn die <b> Tags verschachtelt sind, wird derselbe Regexp mit einem öffnenden <b> Tag und dem falschen schließenden </b> übereinstimmen. Bei dem Fragment <b>bold <b>bolder</b></b> würde das erste <b> mit dem ersten </b> übereinstimmen, was nicht korrekt ist. Es ist jedoch möglich, einen regexp zu schreiben, der verschachtelte Klammern oder Tags korrekt zuordnet, aber nur, wenn die Anzahl der Verschachtelungsebenen feststeht und bekannt ist. Wenn die Anzahl der Verschachtelungsebenen nicht feststeht und bekannt ist, ist es unmöglich, eine Regexp zu schreiben, die nicht fehlschlägt.

Angenommen, wir wollen eine Regexp schreiben, die auf ganze Zahlen im Bereich von 0 bis 99 passt, wobei mindestens eine Ziffer erforderlich ist. Wir beginnen also mit dem Ausdruck [0-9]{1,1}, der genau einmal auf eine einzelne Ziffer passt. Diese Regexp stimmt mit ganzen Zahlen im Bereich von 0 bis 9 überein. Um ganze Zahlen bis 99 zu finden, erhöhen Sie die maximale Anzahl der Vorkommen auf 2, so dass die Regexp zu [0-9]{1,2} wird. Diese Regexp erfüllt die ursprüngliche Anforderung, ganze Zahlen von 0 bis 99 zu finden, aber sie findet auch ganze Zahlen, die in der Mitte von Zeichenketten vorkommen. Wenn die ganze Zeichenkette abgeglichen werden soll, müssen die Ankerzeichen ^ (Caret) und $ (Dollar) verwendet werden. Wenn ^ das erste Zeichen in einer Regexp ist, bedeutet dies, dass die Regexp vom Anfang der Zeichenkette an passen muss. Wenn $ das letzte Zeichen der Regexp ist, bedeutet dies, dass die Regexp bis zum Ende der Zeichenfolge übereinstimmen muss. Die Regexp wird zu ^ [0-9]{1,2}$. Beachten Sie, dass Behauptungen, z. B. ^ und $, nicht auf Zeichen, sondern auf Stellen in der Zeichenkette passen.

Wenn Sie Regexps an anderer Stelle beschrieben gesehen haben, sehen sie vielleicht anders aus als die hier gezeigten. Das liegt daran, dass einige Zeichengruppen und einige Quantifizierer so häufig vorkommen, dass sie durch spezielle Symbole dargestellt werden. [0-9] kann durch das Symbol \d ersetzt werden. Der Quantifizierer für genau ein Vorkommen, {1,1}, kann durch den Ausdruck selbst ersetzt werden, d. h. x{1,1} ist dasselbe wie x. Unser 0-99-Matcher könnte also als ^\d{1 ,2}$ geschrieben werden. Er kann auch als ^\d\d{0 ,1}$ geschrieben werden, d.h. am Anfang der Zeichenkette wird eine Ziffer abgeglichen, unmittelbar gefolgt von 0 oder 1 Ziffern. In der Praxis würde es als ^\d\d ?$ geschrieben werden. Das ? ist eine Abkürzung für den Quantifizierer {0,1}, d. h. 0 oder 1 Vorkommen. ? macht einen Ausdruck optional. Die Regexp ^\d\d ?$ bedeutet, dass am Anfang der Zeichenfolge eine Ziffer übereinstimmt, unmittelbar gefolgt von 0 oder 1 weiteren Ziffer, unmittelbar gefolgt vom Ende der Zeichenfolge.

Um eine Regexp zu schreiben, die auf eines der Wörter "mail" oder "letter" oder "correspondence" passt, aber nicht auf Wörter, die diese Wörter enthalten, z. B. "email", "mailman", "mailer" und "letterbox", beginnen Sie mit einer Regexp, die auf "mail" passt. Vollständig ausgedrückt lautet die Regexp 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 die Regexp zu mail vereinfachen, d. h. ein 'm' gefolgt von einem 'a' gefolgt von einem 'i' gefolgt von einem 'l'. Nun können wir den vertikalen Balken |, der für oder steht, verwenden, um die beiden anderen Wörter einzuschließen, so dass unsere Regexp für die Übereinstimmung mit einem der drei Wörter zu mail|letter|correspondence wird. Passt auf 'mail' oder 'letter' oder 'correspondence'. Diese Regexp stimmt zwar mit einem der drei gewünschten Wörter überein, aber sie stimmt auch mit Wörtern überein, die nicht übereinstimmen sollen, z. B. "E-Mail". Um zu verhindern, dass die Regexp mit unerwünschten Wörtern übereinstimmt, müssen wir ihr sagen, dass sie die Übereinstimmung an Wortgrenzen beginnen und beenden soll. Zuerst schließen wir unsere Regexp in Klammern ein, (mail|letter|correspondence). Klammern fassen Ausdrücke zusammen und kennzeichnen einen Teil des Regexp, den wir capture möchten. Wenn wir den Ausdruck in Klammern setzen, können wir ihn als Komponente in komplexeren Regexps verwenden. Außerdem können wir so untersuchen, welches der drei Wörter tatsächlich übereinstimmt. Um zu erzwingen, dass die Übereinstimmung an Wortgrenzen beginnt und endet, schließen wir die Regexp in \b-Wortgrenzen-Assertionen ein: \b (mail|brief|korrespondenz)\b. Jetzt bedeutet die Regexp: Übereinstimmung mit einer Wortgrenze, gefolgt von der Regexp in Klammern, gefolgt von einer Wortgrenze. Die Behauptung \b entspricht einer Position in der Regexp, nicht einem Zeichen. Eine Wortgrenze ist ein beliebiges Nicht-Wortzeichen, z. B. ein Leerzeichen, ein Zeilenumbruch oder der Anfang oder das Ende einer Zeichenfolge.

Wenn wir kaufmännische Und-Zeichen durch die HTML-Entität &amp; ersetzen wollen , ist die Regexp, die passen soll, einfach &. Diese Regexp findet jedoch auch Ampersands, die bereits in HTML-Entities umgewandelt wurden. Wir wollen nur die Ampersands ersetzen, die nicht bereits von amp; gefolgt sind. Dazu benötigen wir die negative Vorausschau-Assertion (?!__). Die Regexp kann dann als &(?!amp;) geschrieben werden, d.h. ein kaufmännisches Und-Zeichen, das nicht von amp; gefolgt wird, muss gefunden werden.

Wenn wir alle Vorkommen von 'Eric' und 'Eirik' in einer Zeichenkette zählen wollen, sind zwei gültige Lösungen \b (Eric|Eirik)\b und \bEi ?ri[ck]\b. Die Wortgrenzenbehauptung '\b' ist erforderlich, um zu vermeiden, dass Wörter übereinstimmen, die beide Namen enthalten, z. B. 'Ericsson'. Beachten Sie, dass die zweite Regexp mit mehr Schreibweisen übereinstimmt, als wir wollen: 'Eric', 'Erik', 'Eiric' und 'Eirik'.

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

Zeichen und Abkürzungen für Zeichensätze

ElementBedeutung
cEin Zeichen steht für sich selbst, es sei denn, es hat eine spezielle Regexp-Bedeutung. z.B. c entspricht dem Zeichen c.
\cEin Zeichen, das auf einen umgekehrten Schrägstrich folgt, entspricht dem Zeichen selbst, außer wie unten angegeben. z.B.: Um mit einem literalen Caret am Anfang einer Zeichenfolge übereinzustimmen, schreiben Sie \^.
\aEntspricht der ASCII-Glocke (BEL, 0x07).
\fEntspricht dem ASCII-Formfeed (FF, 0x0C).
\nEntspricht dem ASCII-Zeilenvorschub (LF, 0x0A, Unix newline).
\rEntspricht dem ASCII-Wagenrücklauf (CR, 0x0D).
\tEntspricht dem ASCII horizontalen Tabulator (HT, 0x09).
\vEntspricht dem ASCII-Vertikaltabulator (VT, 0x0B).
\xhhhhEntspricht dem Unicode-Zeichen, das der hexadezimalen Zahl 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).
\dStimmt mit einer Ziffer überein (QChar::isDigit()).
\DStimmt mit einer Nicht-Ziffer überein.
\sStimmt mit einem Leerzeichen überein (QChar::isSpace()).
\SPasst auf ein Nicht-Leerzeichen.
\wEntspricht einem Wortzeichen (QChar::isLetterOrNumber(), QChar::isMark(), oder '_').
\WPasst zu einem Nicht-Wort-Zeichen.
\nDie n-te Rückreferenz, z. B. \1, \2 usw.

Hinweis: Der C++-Compiler wandelt Backslashes in Zeichenketten um. Um ein \ in einen Regexp einzuschließen, geben Sie es zweimal ein, d. h. \\. Um das Backslash-Zeichen selbst zu finden, geben Sie es viermal ein, z. B. \\\\.

Gruppen von Zeichen

Eckige Klammern bedeuten, dass jedes in den eckigen Klammern enthaltene Zeichen übereinstimmt. Die oben beschriebenen Zeichensatzabkürzungen können in einem Zeichensatz in eckigen Klammern erscheinen. Abgesehen von den Zeichensatzabkürzungen und den beiden folgenden Ausnahmen haben Zeichen in eckigen Klammern keine besondere Bedeutung.

^Das Caret negiert den Zeichensatz, wenn es als erstes Zeichen (d.h. unmittelbar nach der öffnenden eckigen Klammer) auftritt. [abc] entspricht 'a' oder 'b' oder 'c', aber [^abc] entspricht allem außer 'a' oder 'b' oder 'c'.
-Der Bindestrich kennzeichnet einen Bereich von Zeichen. [W-Z] passt auf 'W' oder 'X' oder 'Y' oder 'Z'.

Die Verwendung der vordefinierten Zeichensatzabkürzungen ist plattform- und sprachenunabhängiger als die Verwendung von Zeichenbereichen. Zum Beispiel entspricht [0-9] einer Ziffer in westlichen Alphabeten, aber \d entspricht einer Ziffer in jedem Alphabet.

Hinweis: In anderen Regexp-Dokumentationen werden Zeichensätze oft als "Zeichenklassen" bezeichnet.

Quantoren

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

E?Entspricht null oder einem Vorkommen von E. Dieser Quantifizierer bedeutet, dass der vorherige Ausdruck optional ist, da er unabhängig davon übereinstimmt, ob der Ausdruck gefunden wird oder nicht. E? ist dasselbe wie E{0,1}. z.B. passt dents? auf 'dent' oder 'dents'.
E+Entspricht einem oder mehreren Vorkommen von E. E+ entspricht E{1,}. z.B. 0+ entspricht '0', '00', '000', usw.
E*Entspricht null oder mehr Vorkommen von E. Es ist dasselbe wie E{0,}. Der *-Quantifizierer wird oft fälschlicherweise verwendet, wenn + verwendet werden sollte. Wenn z. B. \s*$ in einem Ausdruck verwendet wird, um Zeichenketten abzugleichen, die mit einem Leerzeichen enden, passt er auf jede Zeichenkette, denn \s*$ bedeutet Match zero or more whitespaces followed by end of string. Die korrekte Regexp für Zeichenfolgen, die mindestens ein Leerzeichen am Ende enthalten, ist \s+$.
E{n}Entspricht genau n Vorkommen von E. E{n} ist dasselbe wie die n-malige Wiederholung von E. Zum Beispiel ist x{5} das gleiche wie xxxxx. Es ist auch dasselbe wie E{n,n}, z. B. x{5,5}.
E{n,}Entspricht mindestens n Vorkommen von E.
E{,m}Passt zu höchstens m Vorkommen von E. E{,m} ist dasselbe wie E{0,m}.
E{n,m}Entspricht mindestens n und höchstens m Vorkommen von E.

Um einen Quantifizierer auf mehr als nur das vorangehende Zeichen anzuwenden, verwenden Sie Klammern, um Zeichen in einem Ausdruck zusammenzufassen. Zum Beispiel passt tag+ auf ein 't' gefolgt von einem 'a' gefolgt von mindestens einem 'g', während (tag)+ auf mindestens ein Vorkommen von 'tag' passt.

Hinweis: Quantifizierer sind normalerweise "gierig". Sie passen immer auf so viel Text wie möglich. Zum Beispiel passt 0+ auf die erste gefundene Null und alle nachfolgenden Nullen nach der ersten Null. Angewandt auf "20005" entspricht es "20005". Quantifizierer können nicht-gierig gemacht werden, siehe setMinimal().

Erfassen von Text

Mit Hilfe von Klammern können wir Elemente gruppieren, um sie zu quantifizieren und zu erfassen. Wenn zum Beispiel der Ausdruck mail|letter|correspondence auf eine Zeichenfolge passt, wissen wir, dass eines der Wörter passt, aber nicht welches. Wenn wir also (mail|letter|correspondence) verwenden und diesen Regexp 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 der Regexp selbst verwenden. Um auf den erfassten Text zu verweisen, verwenden wir Rückverweise, die von 1 an indiziert werden, genau wie bei cap(). Wir könnten zum Beispiel nach doppelten Wörtern in einer Zeichenkette suchen, indem wir \b (\w+)\W+\1\b verwenden, was bedeutet, dass eine Wortgrenze, gefolgt von einem oder mehreren Wortzeichen, gefolgt von einem oder mehreren Nicht-Wortzeichen, gefolgt von demselben Text wie der erste geklammerte Ausdruck, gefolgt von einer Wortgrenze, übereinstimmt.

Wenn wir Klammern nur zur Gruppierung und nicht zur Erfassung verwenden wollen, können wir die nicht-erfassende Syntax verwenden, z. B. (?:green|blue). Nicht-erfassende Klammern beginnen mit '(?:' und enden mit ')'. In diesem Beispiel stimmen wir entweder mit "grün" oder "blau" überein, aber wir erfassen die Übereinstimmung nicht, so dass wir nur wissen, ob wir übereinstimmen oder nicht, aber nicht, welche Farbe wir tatsächlich gefunden haben. Die Verwendung von nicht erfassenden Klammern ist effizienter als die Verwendung von erfassenden Klammern, da die Regexp-Engine weniger Buchhaltungsarbeit leisten muss.

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

Aus historischen Gründen sind Quantoren (z. B. *), die sich auf schließende Klammern beziehen, "gieriger" als andere Quantoren. Zum Beispiel passt a*(a*) auf "aaa" mit cap(1) == "aaa". Dieses Verhalten unterscheidet sich von dem anderer Regexp-Engines (vor allem Perl). Um ein intuitiveres Erfassungsverhalten zu erhalten, geben Sie QRegExp::RegExp2 an den QRegExp-Konstruktor an oder rufen Sie setPatternSyntax(QRegExp::RegExp2) auf.

Wenn die Anzahl der Übereinstimmungen nicht im Voraus bestimmt werden kann, ist es eine übliche Redewendung, 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"]

Behauptungen

Behauptungen machen eine Aussage über den Text an der Stelle, an der sie in der Regexp vorkommen, aber sie stimmen nicht mit irgendwelchen Zeichen überein. In der folgenden Liste steht E für einen beliebigen Ausdruck.

^Das Caret steht für den Anfang der Zeichenkette. Wenn Sie mit einem Literal ^ übereinstimmen wollen, müssen Sie es mit \\^ abschließen. Zum Beispiel passt ^#include nur auf Zeichenketten, die mit den Zeichen '#include' beginnen. (Wenn das Caret das erste Zeichen eines Zeichensatzes ist, hat es eine besondere Bedeutung, siehe Sets of Characters.)
$Der Dollar steht für das Ende der Zeichenkette. Zum Beispiel passt \d\s*$ auf Zeichenketten, die mit einer Ziffer enden, optional gefolgt von einem Leerzeichen. Wenn Sie mit einem Literal $ übereinstimmen wollen, müssen Sie es mit \\$ abschließen.
\bEine Wortgrenze. Die Regexp \bOK\b bedeutet zum Beispiel, dass unmittelbar nach einer Wortgrenze (z. B. Anfang der Zeichenfolge oder Leerzeichen) der Buchstabe 'O' und dann der Buchstabe 'K' unmittelbar vor einer anderen Wortgrenze (z. B. Ende der Zeichenfolge oder Leerzeichen) übereinstimmen. Wenn wir also (\bOK\b) schreiben und eine Übereinstimmung haben, enthält sie nur "OK", auch wenn die Zeichenfolge "It's OK now" lautet.
\BEine Nicht-Wort-Grenze. Diese Behauptung ist wahr, wenn \b falsch ist. Wenn wir zum Beispiel nach \Bon\B in "Left on" suchen würden, würde die Übereinstimmung fehlschlagen (Leerzeichen und Ende der Zeichenkette sind keine Nicht-Wortgrenzen), aber sie würde in "tonne" übereinstimmen.
(?=E)Positive Vorausschau. Diese Behauptung ist wahr, wenn der Ausdruck an dieser Stelle in der Regexp übereinstimmt. Zum Beispiel passt const(?=\s+char) auf "const", wenn es von "char" gefolgt wird, wie in "static const char *". (Vergleiche mit const\s+char, das auf 'static const char *' passt).
(?!E)Negative Vorausschau. Diese Behauptung ist wahr, wenn der Ausdruck an dieser Stelle in der Regexp nicht übereinstimmt. Zum Beispiel passt const(?!\s+char) auf 'const' , es sei denn, es folgt ein 'char'.

Platzhalterübereinstimmung

Die meisten Befehlsshells wie bash oder cmd.exe unterstützen "file globbing", die Möglichkeit, eine Gruppe von Dateien mit Hilfe von Platzhaltern zu identifizieren. Die Funktion setPatternSyntax() wird verwendet, um zwischen Regexp- und Wildcard-Modus zu wechseln. Der Wildcard-Abgleich ist viel einfacher als vollständige Regexps und hat nur vier Funktionen:

cJedes Zeichen steht für sich selbst, außer den unten genannten. Somit passt c auf das Zeichen c.
?Passt auf jedes einzelne Zeichen. Es ist dasselbe wie . in vollständigen Regexps.
*Passt auf null oder mehr beliebige Zeichen. Entspricht .* in vollständigen Regexps.
[...]Gruppen von Zeichen können in eckigen Klammern dargestellt werden, ähnlich wie bei vollständigen Regexps. Innerhalb der Zeichenklasse, wie auch außerhalb, hat der Backslash keine besondere Bedeutung.

Im Modus Wildcard können die Platzhalterzeichen nicht escaped werden. Im Modus WildcardUnix wird der Platzhalter durch das Zeichen '\' umgangen.

Wenn wir zum Beispiel im Wildcard-Modus sind und Zeichenketten haben, die Dateinamen enthalten, könnten wir HTML-Dateien mit *.html identifizieren. Dies entspricht null oder mehr Zeichen gefolgt von einem Punkt, gefolgt von 'h', 't', 'm' und 'l'.

Um eine Zeichenfolge auf einen Platzhalterausdruck zu prüfen, verwenden Sie exactMatch(). Zum 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 der von Perl unterstützten Zeichenklassenabkürzungen werden von QRegExp unterstützt, siehe characters and abbreviations for sets of characters.

In QRegExp, außer innerhalb von Zeichenklassen, bedeutet ^ immer den Anfang der Zeichenkette, daher müssen Carets immer escaped werden, es sei denn, sie werden zu diesem Zweck verwendet. In Perl ändert sich die Bedeutung von caret automatisch, je nachdem, wo es vorkommt, so dass es selten notwendig ist, es zu escapen. Das gleiche gilt für $, das in QRegExp immer das Ende der Zeichenkette bedeutet.

Die Quantoren von QRegExp sind die gleichen wie die greedy-Quantoren von Perl (siehe aber note above). Non-Greedy-Matching kann nicht auf einzelne Quantoren angewendet werden, wohl aber auf alle Quantoren im Muster. Zum Beispiel erfordert die Übereinstimmung mit der Perl-Regexp ro+?m:

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

Die Entsprechung der Perl-Option /i ist setCaseSensitivity(Qt::CaseInsensitive).

Die Option /g von Perl kann mit loop emuliert werden.

In QRegExp passt . auf jedes beliebige Zeichen, daher haben alle QRegExp-Regexps das Äquivalent zu Perls Option /s. QRegExp hat kein Äquivalent zu Perls /m Option, aber diese kann auf verschiedene Arten emuliert werden, z.B. durch Aufteilung der Eingabe in Zeilen oder durch eine Schleife mit einer Regexp, die nach Zeilenumbrüchen sucht.

Da QRegExp stringorientiert ist, gibt es keine \A-, \Z- oder \z-Assertions. Die \G-Assertion wird nicht unterstützt, kann aber in einer Schleife emuliert werden.

Das $& von Perl ist cap(0) oder capturedTexts()[0]. Es gibt keine QRegExp-Äquivalente für $`, $' oder $+. Perls Capturing-Variablen, $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 /x -Syntax von Perl 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 literale Zeichenketten verwendet werden, um das Gleiche zu erreichen:

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

Sowohl positive als auch negative Lookahead-Assertions mit Null-Breite (?=pattern) und (?!pattern) werden mit der gleichen Syntax wie in Perl unterstützt. Die Lookbehind-Assertions von Perl, "unabhängige" Unterausdrücke und bedingte Ausdrücke werden nicht unterstützt.

Nicht-einfangende Klammern werden ebenfalls unterstützt, mit der gleichen (?:pattern) Syntax.

Siehe QString::split() und QStringList::join() für Äquivalente zu Perls Split- und Join-Funktionen.

Hinweis: Da C++ \'s transformiert, müssen sie im Code zweimal geschrieben werden, z.B. muss \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 Zeichenfolge entspricht'6'. Dies ist eine einfache Validierungs-Regexp für ganze Zahlen 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 entspricht"This_is-OK". Wir haben die Zeichensatzabkürzung "\S" (ohne Leerzeichen) und die Anker verwendet, um Zeichenfolgen zu finden, die keine Leerzeichen enthalten.

Im folgenden Beispiel passen wir auf Zeichenfolgen, die "mail" oder "letter" oder "correspondence" enthalten, aber nur auf ganze Wörter, d. h. nicht auf "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 entspricht "Bitte schreiben Sie den Brief". Das Wort "Brief" wird ebenfalls erfasst (wegen der Klammern). So können wir sehen, welchen Text wir erfasst haben:

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

Dies erfasst den Text aus dem ersten Satz von Erfassungsklammern (wobei die Erfassungsklammern von links nach rechts gezählt werden). Die Klammern werden von 1 an gezählt, da cap(0) der gesamte übereinstimmende Regexp ist (gleichbedeutend mit '&' in den meisten Regexp-Engines).

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 die QRegExp an die Funktion replace() 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 die Regexp in der Zeichenkette wiederholt abzugleichen. Beachten Sie, dass wir anstelle von pos++ auch pos += rx.matchedLength() hätten schreiben können, um die bereits übereinstimmende Zeichenkette zu überspringen, anstatt jeweils um ein Zeichen weiterzugehen. Die Zählung wird 3 ergeben, d.h. "Ein Eric, ein weiterer Eirik und ein Ericsson. Wie viele Eiriks, Eric?'; er passt nicht auf 'Ericsson' oder 'Eiriks', weil sie nicht durch Nicht-Wortgrenzen begrenzt sind.

Eine häufige Verwendung von Regexps ist die Aufteilung von Zeilen mit abgegrenzten Daten in ihre einzelnen Felder.

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 die Regexp ziemlich lang und nicht sehr vielseitig - der Code bricht ab, wenn wir weitere Felder hinzufügen. Eine einfachere und bessere Lösung ist die Suche nach dem Trennzeichen, in diesem Fall '\t', und die Übernahme des umgebenden Textes. Die Funktion QString::split() kann eine Trennzeichenfolge oder einen Regexp als Argument verwenden und eine Zeichenfolge entsprechend aufteilen.

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

Hier ist feld[0] das Unternehmen, feld[1] die Webadresse und so weiter.

Um das Matching einer Shell zu imitieren, 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

Wildcard-Matching kann wegen seiner Einfachheit praktisch sein, aber jeder Wildcard-Regexp kann mit vollständigen Regexps definiert werden, z. B. .*\.html$. Beachten Sie, dass wir mit einem Platzhalter nicht sowohl die Dateien .html als auch .htm abgleichen können, es sei denn, wir verwenden *.htm*, was auch mit "test.html.bak" übereinstimmen würde. Eine vollständige Regexp gibt uns die Präzision, die wir brauchen: .*\.html?$.

QRegExp kann Groß- und Kleinschreibung ignorieren ( setCaseSensitivity()), und es kann auch nicht-gierige Übereinstimmungen verwenden (siehe setMinimal()). Standardmäßig verwendet QRegExp vollständige Regexps, aber das kann mit setPatternSyntax() geändert werden. Die Suche kann vorwärts mit indexIn() oder rückwärts mit lastIndexIn() durchgeführt werden. Auf den erfassten Text kann mit capturedTexts() zugegriffen werden, das eine Liste aller erfassten Zeichenketten zurückgibt, oder mit cap(), das die erfasste Zeichenkette für den angegebenen Index zurückgibt. Die Funktion pos() nimmt einen Trefferindex und gibt die Position in der Zeichenkette zurück, an der der Treffer erzielt wurde (oder -1, wenn es keinen Treffer gab).

Portierung auf QRegularExpression

Die in Qt 5 eingeführte Klasse QRegularExpression implementiert Perl-kompatible reguläre Ausdrücke und ist eine große Verbesserung gegenüber QRegExp in Bezug auf die angebotenen APIs, die unterstützte Mustersyntax und die Ausführungsgeschwindigkeit. Der größte Unterschied besteht darin, dass QRegularExpression einfach einen regulären Ausdruck enthält, der nicht verändert wird, wenn eine Übereinstimmung angefordert wird. Stattdessen wird ein QRegularExpressionMatch Objekt zurückgegeben, um das Ergebnis einer Übereinstimmung zu überprüfen und die erfasste Teilzeichenkette zu extrahieren. Das Gleiche gilt für den globalen Abgleich und QRegularExpressionMatchIterator.

Weitere Unterschiede werden im Folgenden erläutert.

Hinweis: QRegularExpression unterstützt nicht alle Funktionen, die in Perl-kompatiblen regulären Ausdrücken verfügbar sind. Das bemerkenswerteste ist die Tatsache, dass doppelte Namen für die Erfassung von Gruppen nicht unterstützt werden und deren Verwendung zu undefiniertem Verhalten führen kann. Dies könnte sich in einer zukünftigen Version von Qt ändern.

Unterschiedliche Mustersyntax

Das Portieren eines regulären Ausdrucks von QRegExp nach QRegularExpression kann Änderungen am Muster selbst erfordern.

In bestimmten Szenarien war QRegExp zu nachsichtig und akzeptierte Muster, die bei Verwendung von QRegularExpression einfach ungültig sind. Diese sind leicht zu erkennen, da die mit diesen Mustern erstellten QRegularExpression Objekte nicht gültig sind (siehe QRegularExpression::isValid()).

In anderen Fällen kann ein Muster, das von QRegExp auf QRegularExpression portiert wurde, die Semantik stillschweigend ändern. Daher ist es notwendig, die verwendeten Muster zu überprüfen. Die bemerkenswertesten Fälle von stiller Inkompatibilität sind:

  • Geschweifte Klammern sind erforderlich, um einen hexadezimalen Escape wie \xHHHH mit mehr als 2 Ziffern zu verwenden. Ein Muster wie \x2022 muss auf \x{2022} portiert werden, oder es passt auf ein Leerzeichen (0x20) gefolgt von der Zeichenkette "22". Im Allgemeinen ist es sehr empfehlenswert, immer geschweifte Klammern mit dem \x Escape zu verwenden, unabhängig von der Anzahl der angegebenen Ziffern.
  • Eine 0-zu-n-Quantifizierung wie {,n} muss auf {0,n} portiert werden, um die Semantik zu erhalten. Andernfalls würde ein Muster wie \d{,3} mit einer Ziffer übereinstimmen, gefolgt von der exakten Zeichenkette "{,3}".
  • QRegExp führt standardmäßig eine Unicode-konforme Anpassung durch, während QRegularExpression eine separate Option erfordert; siehe unten für weitere Details.
  • c{.} in QRegExp passt standardmäßig auf alle Zeichen, auch auf den Zeilenumbruch. QRegularExpression schließt den Zeilenumbruch standardmäßig aus. Um den Zeilenumbruch einzuschließen, setzen Sie die Option QRegularExpression::DotMatchesEverythingOption pattern.

Einen Überblick über die von QRegularExpression unterstützte Syntax regulärer Ausdrücke finden Sie in der Man Page pcrepattern(3), die die von PCRE (der Referenzimplementierung von Perl-kompatiblen regulären Ausdrücken) unterstützte Mustersyntax beschreibt.

Portierung von QRegExp::exactMatch()

QRegExp::exactMatch() diente zwei Zwecken: Sie glich einen regulären Ausdruck exakt mit einer Zeichenkette ab und implementierte eine teilweise Übereinstimmung.

Portierung von QRegExp's Exact Matching

Der exakte Abgleich gibt an, ob der reguläre Ausdruck mit der gesamten Zeichenkette übereinstimmt. Die Klassen ergeben zum Beispiel die Zeichenkette "abc123":

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

Eine exakte Übereinstimmung wird in QRegularExpression nicht wiedergegeben. Wenn Sie sicher sein wollen, dass die Betreffzeichenkette genau mit dem regulären Ausdruck übereinstimmt, können Sie das Muster mit der Funktion QRegularExpression::anchoredPattern() einschließen:

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

// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));
Portierung von QRegExp's partiellem Matching

Wenn bei der Verwendung von QRegExp::exactMatch() keine exakte Übereinstimmung gefunden wurde, konnte man durch den Aufruf von QRegExp::matchedLength() immer noch herausfinden, wie viel der Betreffzeichenkette mit dem regulären Ausdruck übereinstimmte. Wenn die zurückgegebene Länge gleich der Länge der Zeichenkette war, konnte man daraus schließen, dass eine teilweise Übereinstimmung gefunden wurde.

QRegularExpression unterstützt partielle Übereinstimmungen explizit durch die entsprechende QRegularExpression::MatchType.

Globaler Abgleich

Aufgrund der Beschränkungen der QRegExp-API war es nicht möglich, globale Übereinstimmungen korrekt zu implementieren (also so, wie es Perl tut). Insbesondere Muster, die mit 0 Zeichen übereinstimmen können (wie "a*"), sind problematisch.

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

Wenn Sie zum Beispiel einen Code wie:

QString subject("the quick fox");

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

Sie können ihn umschreiben als:

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 passen Zeichenklassen wie \w, \d usw. auf Zeichen mit der entsprechenden Unicode-Eigenschaft: \d passt zum Beispiel auf jedes Zeichen mit der Unicode-Eigenschaft Nd (Dezimalziffer).

Diese Zeichenklassen passen standardmäßig nur auf ASCII-Zeichen, wenn QRegularExpression verwendet wird: \d passt beispielsweise genau auf ein Zeichen im 0-9 ASCII-Bereich. Es ist möglich, dieses Verhalten mit der Option QRegularExpression::UseUnicodePropertiesOption pattern zu ändern.

Wildcard-Abgleich

Es gibt keine direkte Möglichkeit, Wildcard-Matches in QRegularExpression durchzuführen. QRegularExpression::wildcardToRegularExpression() bietet jedoch die Möglichkeit, glob-Muster in einen Perl-kompatiblen regulären Ausdruck zu übersetzen, der für diesen Zweck verwendet werden kann.

Wenn Sie zum Beispiel Code haben wie:

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

Sie können ihn umschreiben als:

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

Bitte beachten Sie jedoch, dass einige Shell-ähnliche Wildcard-Muster möglicherweise nicht so übersetzt werden, wie Sie es erwarten. Der folgende Beispielcode bricht stillschweigend ab, wenn er einfach mit der oben erwähnten Funktion umgewandelt 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

Das liegt daran, dass der reguläre Ausdruck, der von QRegularExpression::wildcardToRegularExpression() zurückgegeben wird, 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 die minimale Übereinstimmung, indem es einfach die Gierigkeit der Quantoren umkehrte (QRegExp unterstützte keine faulen Quantoren, wie *?, +?, usw.). QRegularExpression unterstützt stattdessen gierige, faule und besitzanzeigende Quantoren. Die Option QRegularExpression::InvertedGreedinessOption pattern kann nützlich sein, um die Auswirkungen von QRegExp::setMinimal() zu emulieren: Wenn sie aktiviert ist, kehrt sie die Gierigkeit von Quantoren um (gierige Quantoren werden faul und umgekehrt).

Caret-Modi

Die Option QRegularExpression::AnchorAtOffsetMatchOption match kann verwendet werden, um das Verhalten von QRegExp::CaretAtOffset zu emulieren. Es gibt keine Entsprechung für die anderen QRegExp::CaretMode Modi.

Siehe auch QString, QStringList, und QSortFilterProxyModel.

Dokumentation der Mitgliedstypen

enum QRegExp::CaretMode

Die Aufzählung CaretMode definiert die verschiedenen Bedeutungen des Caret(^) in einem regulären Ausdruck. Die möglichen Werte sind:

KonstanteWertBeschreibung
QRegExp::CaretAtZero0Das Caret entspricht dem Index 0 in der gesuchten Zeichenkette.
QRegExp::CaretAtOffset1Das Caret entspricht dem Startoffset der Suche.
QRegExp::CaretWontMatch2Das Caret passt nie.

enum QRegExp::PatternSyntax

Die zur Interpretation der Bedeutung des Musters verwendete Syntax.

KonstanteWertBeschreibung
QRegExp::RegExp0Eine umfangreiche Perl-ähnliche Syntax für den Mustervergleich. Dies ist die Standardeinstellung.
QRegExp::RegExp23Wie RegExp, aber mit greedy quantifiers. (Eingeführt in Qt 4.2.)
QRegExp::Wildcard1Dies bietet eine einfache Syntax für den Mustervergleich, ähnlich der, die von Shells (Befehlsinterpretern) für "file globbing" verwendet wird. Siehe QRegExp wildcard matching.
QRegExp::WildcardUnix4Dies ist vergleichbar mit Wildcard, aber mit dem Verhalten einer Unix-Shell. Die Wildcard-Zeichen können mit dem Zeichen "\" escaped werden.
QRegExp::FixedString2Das Muster ist eine feste Zeichenkette. Dies entspricht der Verwendung des RegExp-Musters auf eine Zeichenkette, in der alle Metazeichen mit escape() maskiert sind.
QRegExp::W3CXmlSchema115Das Muster ist ein regulärer Ausdruck, wie er in der W3C XML Schema 1.1 Spezifikation definiert ist.

Siehe auch setPatternSyntax().

Dokumentation der Mitgliedsfunktionen

QRegExp::QRegExp()

Konstruiert eine leere Regexp.

Siehe auch isValid() und errorString().

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

Konstruiert ein Objekt des regulären Ausdrucks für die angegebene Zeichenkette pattern. Das Muster muss in Platzhalterschreibweise angegeben werden, wenn syntax gleich Wildcard ist; die Vorgabe ist RegExp. Das Muster unterscheidet Groß- und Kleinschreibung, es sei denn, cs ist Qt::CaseInsensitive. Die Übereinstimmung ist gierig (maximal), kann aber durch Aufruf von setMinimal() geändert werden.

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

QRegExp::QRegExp(const QRegExp &rx)

Konstruiert einen regulären Ausdruck als eine Kopie von rx.

Siehe auch operator=().

[noexcept] QRegExp::~QRegExp()

Zerstört den regulären Ausdruck und bereinigt seine internen Daten.

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

Gibt den Text zurück, der durch den Unterausdruck nth erfasst wird. Die gesamte Übereinstimmung hat den Index 0 und die eingeklammerten Unterausdrücke haben Indizes ab 1 (mit Ausnahme der nicht erfassenden Klammern).

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() übereinstimmenden Elemente ist wie folgt. Das erste Element, cap(0), ist die gesamte übereinstimmende Zeichenfolge. Jedes nachfolgende Element entspricht der nächstfolgenden offenen linken Klammer. cap(1) ist also der Text der ersten Klammer, cap(2) ist der Text der zweiten Klammer und so weiter.

Siehe auch capturedTexts() und pos().

int QRegExp::captureCount() const

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

QStringList QRegExp::capturedTexts() const

Gibt eine Liste der erfassten Textzeichenfolgen zurück.

Die erste Zeichenfolge in der Liste ist die gesamte übereinstimmende Zeichenfolge. Jedes nachfolgende Listenelement enthält eine Zeichenfolge, die mit einem (erfassenden) Unterausdruck der Regexp übereinstimmt.

Ein 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")

Im obigen Beispiel werden auch Elemente erfasst, die zwar vorhanden sein können, die uns aber nicht interessieren. Dieses Problem kann durch die Verwendung von nicht-erfassenden Klammern gelöst werden:

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")

Wenn Sie über die Liste iterieren wollen, sollten Sie über eine Kopie iterieren, z. B.

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

Einige Regexps können eine unbestimmte Anzahl von Übereinstimmungen aufweisen. Wenn zum Beispiel die Eingabe "Offsets: 12 14 99 231 7" lautet und der Regexp rx(\d+)+ ist, würden wir hoffen, eine Liste aller übereinstimmenden 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 Unterausdruck war "12". Der richtige Ansatz ist die Verwendung von cap() in einer loop.

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 zu erfassenden offenen linken Klammer. So ist capturedTexts()[1] der Text der ersten Klammer, capturedTexts()[2] ist der Text der zweiten Klammer und so weiter (entsprechend $1, $2 usw. in einigen anderen Regexp-Sprachen).

Siehe auch cap() und pos().

Qt::CaseSensitivity QRegExp::caseSensitivity() const

Gibt Qt::CaseSensitive zurück, wenn die Regexp 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 Übereinstimmungen dieses regulären Ausdrucks in str zurück.

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

QString QRegExp::errorString() const

Gibt eine Zeichenkette zurück, die erklärt, warum ein Regexp-Muster im vorliegenden Fall ungültig ist; andernfalls wird "kein Fehler aufgetreten" zurückgegeben.

Siehe auch isValid().

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

Gibt die Zeichenkette str zurück, wobei jedes Regexp-Sonderzeichen 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 Regexp-Muster dynamisch zu konstruieren:

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

Siehe auch setPatternSyntax().

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

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

Für eine gegebene Regexp-Zeichenkette R ist exactMatch("R") das Äquivalent zu indexIn("^R$"), da exactMatch() die Regexp-Zeichenkette effektiv in den Ankern "Anfang der Zeichenkette" und "Ende der Zeichenkette" einschließt, mit der Ausnahme, dass es matchedLength() anders setzt.

Wenn der reguläre Ausdruck zum Beispiel blau ist, gibt exactMatch() nur für die Eingabe blue true zurück. Für die Eingaben bluebell, blutak und lightblue gibt exactMatch() false zurück und matchedLength() gibt 4, 3 bzw. 0 zurück.

Obwohl diese Funktion konstant ist, setzt sie matchedLength(), capturedTexts() und pos().

Siehe auch indexIn() und lastIndexIn().

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

Gibt eine Liste aller Zeichenketten 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 dieser Regexp in list zurück, wobei ab der Indexposition from vorwärts gesucht wird. Gibt -1 zurück, wenn kein Element übereinstimmt.

Siehe auch lastIndexIn() und exactMatch().

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

Versucht, eine Übereinstimmung in str ab der Position offset (standardmäßig 0) zu finden. Wenn offset -1 ist, beginnt die Suche beim letzten Zeichen, bei -2 beim vorletzten Zeichen usw.

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

Der Parameter caretMode kann verwendet werden, um anzugeben, ob ^ bei Index 0 oder bei offset gesucht werden soll.

Sie könnten es vorziehen, QString::indexOf(), QString::contains() oder sogar QStringList::filter() zu verwenden. 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 konstant, setzt diese Funktion matchedLength(), capturedTexts() und pos().

Wenn QRegExp ein Platzhalterausdruck ist (siehe setPatternSyntax()) und Sie eine Zeichenkette gegen den gesamten Platzhalterausdruck testen wollen, verwenden Sie exactMatch() anstelle dieser Funktion.

Siehe auch lastIndexIn() und exactMatch().

bool QRegExp::isEmpty() const

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

Wenn Sie exactMatch() mit einem leeren Muster für eine leere Zeichenkette aufrufen, wird true zurückgegeben; andernfalls wird false zurückgegeben, da die gesamte Zeichenkette verarbeitet wird. Wenn Sie indexIn() mit einem leeren Muster für eine beliebige Zeichenkette aufrufen, wird der Start-Offset (standardmäßig 0) zurückgegeben, da das leere Muster auf die "Leere" am Anfang der Zeichenkette passt. In diesem Fall ist die Länge der Übereinstimmung, die von matchedLength() zurückgegeben wird, 0.

Siehe QString::isEmpty().

bool QRegExp::isMinimal() const

Gibt true zurück, wenn minimale (nicht gierige) Übereinstimmung aktiviert ist; andernfalls false.

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 passt nie.

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

Beachten Sie, dass die Gültigkeit eines regulären Ausdrucks auch von der Einstellung des Wildcard-Flags abhängen kann, z. B. ist *.html ein gültiger Wildcard-Ausdruck, aber ein ungültiger vollständiger Ausdruck.

Siehe auch errorString().

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

Gibt die Indexposition der letzten exakten Übereinstimmung dieser Regexp in list zurück, wobei ab der Indexposition from rückwärts gesucht wird. Ist from gleich -1 (Standard), beginnt die Suche beim letzten Eintrag. 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, eine Übereinstimmung rückwärts in str ab der Position offset zu finden. Ist offset gleich -1 (Standard), beginnt die Suche beim letzten Zeichen, bei -2 beim vorletzten Zeichen usw.

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

Der Parameter caretMode kann verwendet werden, um anzugeben, ob ^ bei Index 0 oder bei offset übereinstimmen soll.

Obwohl diese Funktion konstant ist, setzt sie matchedLength(), capturedTexts() und pos().

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

Siehe auch indexIn() und exactMatch().

int QRegExp::matchedLength() const

Gibt die Länge der letzten übereinstimmenden Zeichenkette zurück, oder -1, wenn es keine Übereinstimmung gab.

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

QString QRegExp::pattern() const

Gibt die Zeichenkette des regulären Ausdrucks zurück. Das Muster hat entweder die Syntax eines regulären Ausdrucks oder eine Wildcard-Syntax, 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. Die Vorgabe ist QRegExp::RegExp.

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

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

Gibt die Position des nth erfassten Textes in der gesuchten Zeichenfolge zurück. Ist nth gleich 0 (Standard), 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 cap(4) beispielsweise eine leere Zeichenkette zurückgeben würde, gibt pos(4) -1 zurück). Dies ist eine Eigenschaft der Implementierung.

Siehe auch cap() und capturedTexts().

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

Entfernt jedes Vorkommen dieses regulären Ausdrucks str, und gibt das Ergebnis zurück.

Hat die gleiche Funktion 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 die Vorkommen von \1, \2, ..., in after durch rx.cap(1), cap(2), ... ersetzt.

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

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

Ersetzt jedes Vorkommen dieser Regexp in jedem der stringList's durch after. Gibt einen Verweis auf die String-Liste zurück.

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

Setzt die Groß- und Kleinschreibung auf cs.

Wenn cs Qt::CaseSensitive ist, passt \ .txt$ zu readme.txt, aber nicht zu README.TXT.

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

void QRegExp::setMinimal(bool minimal)

Aktiviert oder deaktiviert den minimalen Abgleich. Wenn minimal auf false gesetzt ist, erfolgt der Abgleich gierig (maximal), was der Standard ist.

Nehmen wir zum Beispiel an, wir haben die Eingabe "Wir müssen <b>fett</b> sein, sehr <b>fett</b>!" und das Muster <b>.*</b>. Mit der standardmäßigen gierigen (maximalen) Anpassung lautet die Übereinstimmung "Wir müssen <b>fett</b> sein, sehr <b>fett</b>!". Bei der minimalen (nicht-gierigen) Übereinstimmung lautet die erste Übereinstimmung jedoch: "Wir müssen <b>fett</b> sein , sehr <b>fett</b>!" und die zweite Übereinstimmung ist "Wir müssen <b>fett</b> sein, sehr <b>fett</b>!". In der Praxis könnten wir stattdessen 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 Musterzeichenkette auf pattern. Die Optionen Groß-/Kleinschreibung, Platzhalter und minimale Ü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 Vorgabe ist QRegExp::RegExp.

Wenn Sie syntax auf QRegExp::Wildcard setzen, können Sie einfache Shell-ähnliche QRegExp wildcard matching verwenden. Zum Beispiel passt r*.txt auf die Zeichenfolge readme.txt im Platzhaltermodus, aber nicht auf readme.

Das Setzen von syntax auf QRegExp::FixedString bedeutet, dass das Muster als einfache Zeichenkette interpretiert wird. Sonderzeichen (z.B. Backslash) müssen dann nicht escaped werden.

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

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

Zerlegt str in Teilzeichenketten, auf die dieser reguläre Ausdruck zutrifft, und gibt die Liste dieser Zeichenketten zurück. Wenn dieser reguläre Ausdruck nirgendwo in der Zeichenkette übereinstimmt, gibt split() eine einzelelementige Liste 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)

Tauscht den regulären Ausdruck other mit diesem regulären Ausdruck aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

QVariant QRegExp::operator QVariant() const

Gibt die Regexp als eine QVariant

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

Gibt true zurück, wenn dieser reguläre Ausdruck nicht gleich rx ist; andernfalls wird false zurückgegeben.

Siehe auch operator==().

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

Verschieben - weist other dieser QRegExp Instanz zu.

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

Kopiert den regulären Ausdruck rx und gibt einen Verweis auf die Kopie zurück. Die Optionen Groß-/Kleinschreibung, Platzhalter und minimale Übereinstimmung werden ebenfalls kopiert.

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

Gibt true zurück, wenn dieser reguläre Ausdruck gleich rx ist; andernfalls wird false zurückgegeben.

Zwei QRegExp Objekte sind gleich, wenn sie die gleichen Musterzeichenfolgen und die gleichen Einstellungen für Groß-/Kleinschreibung, Platzhalter und minimale Übereinstimmung haben.

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 von Qt-Datentypen.

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

Liest einen regulären Ausdruck aus stream in in regExp.

Siehe auch Serialisierung von Qt-Datentypen.

© 2025 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.