Sur cette page

QRegExp Class

La classe QRegExp permet la recherche de correspondances à l'aide d'expressions régulières. En savoir plus...

En-tête : #include <QRegExp>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)
qmake : QT += core5compat

Remarque : toutes les fonctions de cette classe sont réentrantes.

Types publics

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

Fonctions publiques

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

Membres publics statiques

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)

Description détaillée

Cette classe est obsolète dans Qt 6. Veuillez utiliser QRegularExpression à la place pour tout nouveau code. Pour obtenir des conseils sur le portage de l'ancien code de QRegExp vers QRegularExpression, consultez Porting to QRegularExpression.

Une expression régulière, ou « regexp », est un modèle permettant de rechercher des sous-chaînes dans un texte. Elle s'avère utile dans de nombreux contextes, par exemple :

la validationUne expression régulière permet de vérifier si une sous-chaîne répond à certains critères, par exemple si elle est un nombre entier ou si elle ne contient aucun espace.
RechercheUne regexp offre des capacités de correspondance de motifs plus puissantes que la simple recherche de sous-chaînes, par exemple pour trouver l’un des mots « mail », « letter » ou « correspondence », mais aucun des mots « email », « mailman », « mailer », « letterbox », etc.
Recherche et remplacementUne expression régulière permet de remplacer toutes les occurrences d’une sous-chaîne par une autre sous-chaîne, par exemple remplacer toutes les occurrences de « & » par « &amp; », sauf lorsque le « & » est déjà suivi d’un « amp; ».
Fractionnement de chaînesUne expression régulière peut être utilisée pour identifier où une chaîne doit être divisée, par exemple pour diviser des chaînes délimitées par des tabulations.

Vous trouverez ici une brève introduction aux expressions régulières, une description du langage d'expressions régulières de Qt, quelques exemples, ainsi que la documentation relative aux fonctions. QRegExp s’inspire du langage d’expressions régulières de Perl. Il prend entièrement en charge Unicode. QRegExp peut également être utilisé dans un mode plus simple, à base de caractères génériques, similaire aux fonctionnalités disponibles dans les interpréteurs de commandes. Les règles syntaxiques utilisées par QRegExp peuvent être modifiées à l’aide de ` setPatternSyntax()` (). En particulier, la syntaxe du motif peut être définie sur ` QRegExp::FixedString`, ce qui signifie que le motif à faire correspondre est interprété comme une chaîne de caractères simple, c’est-à-dire que les caractères spéciaux (par exemple, la barre oblique inversée) ne sont pas échappés.

Un ouvrage de référence sur les expressions régulières est *Mastering Regular Expressions* (troisième édition) de Jeffrey E. F. Friedl, ISBN 0-596-52812-4.

Remarque : dans Qt 5, la nouvelle classe ` QRegularExpression ` fournit une implémentation des expressions régulières compatible avec Perl et est recommandée à la place de `QRegExp`.

Considérations relatives à la sécurité

QRegExp n'impose aucune limite aux ressources qu'un motif peut consommer, et la taille de ses tampons internes peut entraîner un débordement. Un motif spécialement conçu, même relativement petit, peut donc épuiser la mémoire disponible, provoquer un débordement de la pile ou corrompre la mémoire. Ce phénomène se produit lors de la compilation du motif, c'est-à-dire dès que celui-ci est assigné, et ne nécessite aucune correspondance avec du texte. Il en va de même pour les motifs de type ` wildcard `, qui sont traduits en interne en expressions régulières.

N’utilisez QRegExp qu’avec des motifs provenant d’une source fiable. Privilégiez plutôt l’utilisation d’ QRegularExpression, qui limite les ressources qu’une correspondance peut consommer.

Introduction

Les expressions régulières sont constituées d'expressions, de quantificateurs et d'assertions. L'expression la plus simple est un caractère, par exemple x ou 5. Une expression peut également être un ensemble de caractères entre crochets. [ABCD] correspondra à un A, un B, un C ou un D. On peut écrire cette même expression sous la forme [A-D], et une expression permettant de trouver n'importe quelle lettre majuscule de l'alphabet anglais s'écrit [A-Z].

Un quantificateur spécifie le nombre d’occurrences d’une expression qui doivent être trouvées. x{1,1} signifie trouver un et un seul x. x{1,5} signifie trouver une séquence de caractères x contenant au moins un x mais pas plus de cinq.

Notez qu’en général, les expressions régulières ne peuvent pas être utilisées pour vérifier l’équilibre des parenthèses ou des balises. Par exemple, on peut écrire une expression régulière pour faire correspondre une balise d’ouverture HTML <b> et sa balise de fermeture </b>, si les balises <b> ne sont pas imbriquées ; mais si les balises <b> sont imbriquées, cette même expression régulière fera correspondre une balise d’ouverture <b> avec la balise de fermeture erronée </b>. Pour le fragment <b>bold <b>bolder</b></b>, le premier <b> serait mis en correspondance avec le premier </b>, ce qui n’est pas correct. Il est toutefois possible d’écrire une expression régulière qui fera correspondre correctement des crochets ou des balises imbriqués, mais uniquement si le nombre de niveaux d’imbrication est fixe et connu. Si le nombre de niveaux d’imbrication n’est ni fixe ni connu, il est impossible d’écrire une expression régulière qui ne rencontrera pas d’échec.

Supposons que nous souhaitions une expression régulière pour trouver des nombres entiers compris entre 0 et 99. Au moins un chiffre étant requis, nous commençons par l’expression [0-9]{1,1}, qui correspond à un seul chiffre exactement une fois. Cette expression régulière trouve les nombres entiers compris entre 0 et 9. Pour faire correspondre des nombres entiers allant jusqu’à 99, il faut augmenter le nombre maximal d’occurrences à 2 ; l’expression régulière devient alors [0-9]{1,2}. Cette expression régulière répond à l’exigence initiale de faire correspondre des nombres entiers compris entre 0 et 99, mais elle fera également correspondre des nombres entiers apparaissant au milieu de chaînes de caractères. Si l'on souhaite que le nombre entier trouvé corresponde à la chaîne entière, il faut utiliser les ancrages ^ (caret) et $ (dollar). Lorsque ^ est le premier caractère d'une expression régulière, cela signifie que celle-ci doit correspondre dès le début de la chaîne. Lorsque $ est le dernier caractère de l’expression régulière, cela signifie que celle-ci doit correspondre jusqu’à la fin de la chaîne. L’expression régulière devient alors ^[0-9]{1,2}$. Notez que les ancrages, tels que ^ et $, ne correspondent pas à des caractères, mais à des emplacements dans la chaîne.

Si vous avez déjà vu des expressions régulières décrites ailleurs, elles pouvaient sembler différentes de celles présentées ici. En effet, certains ensembles de caractères et certains quantificateurs sont si courants qu’on leur a attribué des symboles spéciaux pour les représenter. [0-9] peut être remplacé par le symbole \d. Le quantificateur permettant de faire correspondre exactement une occurrence, {1,1}, peut être remplacé par l’expression elle-même ; ainsi, x{1,1} équivaut à x. Notre expression régulière pour les nombres de 0 à 99 pourrait donc s’écrire ^\d{1,2}$. On peut également l'écrire ^\d\d {0,1}$, c'est-à-dire : à partir du début de la chaîne, rechercher un chiffre suivi immédiatement de 0 ou 1 chiffre. En pratique, on l'écrirait ^\d\d ?$. Le caractère « ? » est une abréviation du quantificateur {0,1}, c'est-à-dire 0 ou 1 occurrence. Le « ? » rend l'expression facultative. L'expression régulière ^\d\d ?$ signifie : à partir du début de la chaîne, rechercher un chiffre, suivi immédiatement de 0 ou 1 autre chiffre, suivi immédiatement de la fin de la chaîne.

Pour écrire une expression régulière qui corresponde à l’un des mots « mail » , « letter » ou « correspondence », mais qui ne corresponde pas aux mots contenant ces termes, par exemple « email », « mailman », « mailer » et « letterbox », commencez par une expression régulière correspondant à « mail ». Exprimée en entier, l’expression régulière est m{1,1}a{1,1}i{1,1}l{1,1}, mais comme une expression de caractère est automatiquement quantifiée par {1,1}, nous pouvons simplifier l’expression régulière en « mail », c’est-à-dire un « m » suivi d’un « a », puis d’un « i » et enfin d’un « l ». Nous pouvons désormais utiliser la barre verticale |, qui signifie « ou », pour inclure les deux autres mots ; ainsi, notre expression régulière permettant de trouver l’un des trois mots devient mail|letter|correspondence. Rechercher « mail » , « letter » ou « correspondence ». Bien que cette expression régulière corresponde à l’un des trois mots que nous souhaitons trouver, elle correspondra également à des mots que nous ne souhaitons pas trouver, par exemple « email ». Pour empêcher l’expression régulière de correspondre à des mots indésirables, nous devons lui indiquer de commencer et de terminer la correspondance aux limites des mots. Tout d’abord, nous plaçons notre expression régulière entre parenthèses : (mail|letter|correspondence). Les parenthèses regroupent des expressions et identifient une partie de l’expression régulière que nous souhaitons capture. En plaçant l’expression entre parenthèses, nous pouvons l’utiliser comme composant dans des expressions régulières plus complexes. Cela nous permet également de vérifier lequel des trois mots a effectivement été trouvé. Pour forcer la correspondance à commencer et à se terminer sur des limites de mots, nous encadrons l’expression régulière par \b assertions de limite de mot: \b(mail|letter|correspondance)\b. Désormais, l’expression régulière signifie : trouver une limite de mot, suivie de l’expression régulière entre parenthèses, puis d’une limite de mot. L’ \b assertion correspond à une position dans l’expression régulière, et non à un caractère. Une limite de mot est tout caractère n’appartenant pas à un mot, par exemple un espace, un saut de ligne, ou le début ou la fin d’une chaîne.

Si nous voulons remplacer les caractères « & » par l’entité HTML &amp;, l’expression régulière à utiliser est simplement &. Mais cette expression régulière correspondra également aux « & » qui ont déjà été convertis en entités HTML. Nous souhaitons ne remplacer que les « & » qui ne sont pas déjà suivis de « amp; ». Pour cela, nous avons besoin de l’assertion de regard en avant négatif, (?!__). L’expression régulière peut alors s’écrire &(?!amp;), c’est-à-dire : trouver un « & » qui n’ est pas suivi de « amp; ».

Si nous voulons compter toutes les occurrences de « Eric » et « Eirik » dans une chaîne, deux solutions valides sont \b(Eric|Eirik)\b et \bEi?ri[ck]\b. L’assertion de limite de mot «\b » est nécessaire pour éviter de faire correspondre des mots contenant l’un ou l’autre de ces noms, par exemple « Ericsson ». Notez que la deuxième expression régulière correspond à plus de variantes orthographiques que nous ne le souhaitons : « Eric », « Erik », « Eiric » et « Eirik ».

Certains des exemples évoqués ci-dessus sont mis en œuvre dans la section « code examples ».

Caractères et abréviations pour les ensembles de caractères

ÉlémentSignification
cUn caractère représente lui-même, sauf s'il a une signification particulière dans les expressions régulières. Par exemple, c correspond au caractère c.
\cUn caractère suivi d’une barre oblique inversée correspond au caractère lui-même, sauf dans les cas indiqués ci-dessous. Par exemple, pour faire correspondre un accent circonflexe littéral au début d’une chaîne, écrivez \^.
\aCorrespond au caractère ASCII « bell » (BEL, 0x07).
\fCorrespond au caractère de saut de page ASCII (FF, 0x0C).
\nCorrespond au caractère de saut de ligne ASCII (LF, 0x0A, saut de ligne Unix).
\rCorrespond au retour chariot ASCII (CR, 0x0D).
\tCorrespond au caractère de tabulation horizontale ASCII (HT, 0x09).
\vCorrespond à la tabulation verticale ASCII (VT, 0x0B).
\xhhhhCorrespond au caractère Unicode correspondant au nombre hexadécimal hhhh (compris entre 0x0000 et 0xFFFF).
\0ooo (c'est-à-dire \zero ooo)correspond au caractère ASCII/Latin1 correspondant au nombre octal ooo (compris entre 0 et 0377).
. (point)Correspond à n'importe quel caractère (y compris le saut de ligne).
\dCorrespond à un chiffre (QChar::isDigit()).
\DCorrespond à un caractère non numérique.
\sCorrespond à un caractère d'espacement (QChar::isSpace()).
\SCorrespond à un caractère autre qu'un espace.
\wCorrespond à un caractère de mot (QChar::isLetterOrNumber(), QChar::isMark() ou « _ »).
\WCorrespond à un caractère non-mot.
\nLa n-ième référence arrière, par exemple \1, \2, etc.

Remarque : le compilateur C++ transforme les barres obliques inversées dans les chaînes de caractères. Pour inclure un \ dans une expression régulière, saisissez-le deux fois, c'est-à-dire \\. Pour faire correspondre le caractère barre oblique inversée lui-même, saisissez-le quatre fois, c'est-à-dire \\\\.

Ensembles de caractères

Les crochets signifient qu’il faut rechercher n’importe quel caractère contenu entre ces crochets. Les abréviations d’ensembles de caractères décrites ci-dessus peuvent apparaître dans un ensemble de caractères entre crochets. À l’exception des abréviations d’ensembles de caractères et des deux exceptions suivantes, les caractères n’ont pas de signification particulière entre crochets.

^Le signe « ^ » inverse le sens de l'ensemble de caractères s'il apparaît en premier (c'est-à-dire immédiatement après le crochet ouvrant). [abc] correspond à « a », « b » ou « c », mais [^abc] correspond à tout sauf « a », « b » ou « c ».
-Le tiret indique une plage de caractères. [W-Z] correspond à « W », « X », « Y » ou « Z ».

L'utilisation des abréviations de jeux de caractères prédéfinis est plus portable que l'utilisation de plages de caractères d'une plateforme ou d'un langage à l'autre. Par exemple, [0-9] correspond à un chiffre des alphabets occidentaux, mais \d correspond à un chiffre dans n'importe quel alphabet.

Remarque : dans d'autres documentations sur les expressions régulières, les ensembles de caractères sont souvent appelés « classes de caractères ».

Quantificateurs

Par défaut, une expression est automatiquement quantifiée par {1,1}, c'est-à-dire qu'elle doit apparaître exactement une fois. Dans la liste suivante, E désigne une expression. Une expression est un caractère, une abréviation d'un ensemble de caractères, un ensemble de caractères entre crochets ou une expression entre parenthèses.

E?Correspond à zéro ou une occurrence de E. Ce quantificateur signifie que l’expression précédente est facultative, car il donnera une correspondance que l’expression soit présente ou non. E? équivaut à E{0,1}. Par exemple, dents? correspond à « dent » ou à « dents ».
E+Correspond à une ou plusieurs occurrences de E. E+ équivaut à E{1,}. Par exemple, 0+ correspond à « 0 », « 00 », « 000 », etc.
E*Correspond à zéro ou plusieurs occurrences de E. Il équivaut à E{0,}. Le quantificateur * est souvent utilisé par erreur là où il faudrait utiliser +. Par exemple, si l'\s*$ est utilisée dans une expression pour correspondre à des chaînes se terminant par un espace, elle correspondra à toutes les chaînes, car \s*$ signifie « correspondre à zéro ou plusieurs espaces suivis de la fin de la chaîne ». L'expression régulière correcte pour correspondre à des chaînes comportant au moins un caractère d'espacement en fin de chaîne est \s+$.
E{n}Correspond exactement à n occurrences de E. E{n} revient à répéter E n fois. Par exemple, x{5} équivaut à xxxxx. Cela revient également à E{n,n}, par exemple x{5,5}.
E{n,}Recherche au moins n occurrences de E.
E{,m}Correspond à au plus m occurrences de E. E{,m} équivaut à E{0,m}.
E{n,m}Correspond à au moins n et au plus m occurrences de E.

Pour appliquer un quantificateur à plus que le caractère précédent, utilisez des parenthèses afin de regrouper des caractères dans une expression. Par exemple, tag+ correspond à un « t » suivi d'un « a » puis d'au moins un « g », tandis que (tag)+ correspond à au moins une occurrence de « tag ».

Remarque : les quantificateurs sont normalement « gourmands ». Ils font toujours correspondre autant de texte que possible. Par exemple, 0+ correspond au premier zéro trouvé et à tous les zéros consécutifs qui suivent ce premier zéro. Appliqué à « 20005 », il correspond à «20005». Il est possible de rendre les quantificateurs non gourmands ; voir setMinimal().

Capture de texte

Les parenthèses nous permettent de regrouper des éléments afin de pouvoir les quantifier et les capturer. Par exemple, si nous avons l’expression ` mail|letter|correspondence ` qui correspond à une chaîne, nous savons qu’un de ces mots a été trouvé, mais pas lequel. L'utilisation de parenthèses nous permet de « capturer » tout ce qui est mis en correspondance entre leurs limites ; ainsi, si nous utilisons (mail|letter|correspondence) et que nous comparons cette expression régulière à la chaîne « I sent you some email », nous pouvons utiliser les fonctions cap() ou capturedTexts() pour extraire les caractères mis en correspondance, en l'occurrence « mail ».

Nous pouvons utiliser le texte capturé au sein même de l’expression régulière. Pour faire référence au texte capturé, nous utilisons des références arrière qui sont indexées à partir de 1, comme pour la fonction cap(). Par exemple, nous pourrions rechercher des mots en double dans une chaîne à l’aide de `\b` : `(\w)` `\W)` `\1 ` ` \b `, ce qui signifie : trouver une limite de mot suivie d’un ou plusieurs caractères de mot, suivie d’un ou plusieurs caractères non-mot, suivie du même texte que la première expression entre parenthèses, suivie d’une limite de mot.

Si l'on souhaite utiliser les parenthèses uniquement à des fins de regroupement et non de capture, on peut recourir à la syntaxe sans capture, par exemple (?:green|blue). Les parenthèses sans capture commencent par « (?: » et se terminent par « ) ». Dans cet exemple, nous recherchons soit « green », soit « blue », mais nous ne capturons pas le résultat ; nous savons donc uniquement si la correspondance a eu lieu ou non, sans connaître la couleur réellement trouvée. L’utilisation de parenthèses sans capture est plus efficace que celle de parenthèses avec capture, car le moteur d’expressions régulières a moins de travail de gestion à effectuer.

Les parenthèses avec et sans capture peuvent toutes deux être imbriquées.

Pour des raisons historiques, les quantificateurs (par exemple *) qui s’appliquent aux parenthèses capturantes sont plus « gourmands » que les autres quantificateurs. Par exemple, a*(a*) correspondra à « aaa » avec cap(1) == « aaa ». Ce comportement diffère de celui d’autres moteurs d’expressions régulières (notamment Perl). Pour obtenir un comportement de capture plus intuitif, spécifiez l’ QRegExp::RegExp2 e au constructeur QRegExp ou appelez la fonction setPatternSyntax(QRegExp::RegExp2).

Lorsque le nombre de correspondances ne peut pas être déterminé à l’avance, une pratique courante consiste à utiliser ` cap()` dans une boucle. Par exemple :

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

Affirmations

Les assertions fournissent des informations sur le texte à l'endroit où elles apparaissent dans l'expression régulière, mais elles ne correspondent à aucun caractère. Dans la liste suivante, E représente n'importe quelle expression.

^Le signe « ^ » (caret) désigne le début de la chaîne. Si vous souhaitez faire correspondre l'^ e littérale « ^#include », vous devez l'échapper en écrivant « \\^ ». Par exemple, « ^#include » ne correspondra qu'aux chaînes commençant par les caractères « #include ». (Lorsque le signe « ^ » est le premier caractère d'un ensemble de caractères, il a une signification particulière ; voir Sets of Characters.)
$Le signe dollar marque la fin de la chaîne. Par exemple, \d\s *$ correspondra aux chaînes se terminant par un chiffre éventuellement suivi d'un espace. Si vous souhaitez faire correspondre le littéral $, vous devez l'échapper en écrivant \\$.
\bUne limite de mot. Par exemple, l’expression régulière \bOK\b signifie : trouver immédiatement après une limite de mot (par exemple, le début d’une chaîne ou un espace) la lettre « O », puis la lettre « K » immédiatement avant une autre limite de mot (par exemple, la fin d’une chaîne ou un espace). Mais notez que cette assertion ne correspond en réalité à aucun espace ; ainsi, si nous écrivons (\bOK\b ) et que nous obtenons une correspondance, celle-ci ne contiendra que « OK », même si la chaîne est « It's OK now ».
\BUne limite non-mot. Cette assertion est vraie partout où \b est fausse. Par exemple, si l’on recherchait \Bon\B dans « Left on », la correspondance échouerait (l'espace et la fin de chaîne ne sont pas des limites non-mot), mais elle correspondrait dans «tonne».
(?=E)Regard en avant positif. Cette assertion est vraie si l’expression correspond à cet endroit de l’expression régulière. Par exemple, const(?=\s+char) correspond à « const » chaque fois qu’il est suivi de « char », comme dans « static const char * ». (À comparer avec const\s+char, qui correspond à « static const char * ».)
(?!E)Regard en avant négatif. Cette assertion est vraie si l’expression ne correspond pas à cet endroit de l’expression régulière. Par exemple, const(?!\s+char) correspond à « const » sauf lorsqu’il est suivi de « char ».

Correspondance avec des caractères génériques

La plupart des shells de commande, tels que bash ou cmd.exe, prennent en charge le « file globbing », c’est-à-dire la possibilité d’identifier un groupe de fichiers à l’aide de caractères génériques. La fonction setPatternSyntax() permet de basculer entre le mode expression régulière et le mode caractères génériques. La correspondance par caractères génériques est beaucoup plus simple que les expressions régulières complètes et ne comporte que quatre fonctionnalités :

cTout caractère représente lui-même, à l'exception de ceux mentionnés ci-dessous. Ainsi, c correspond au caractère c.
?Correspond à n'importe quel caractère unique. Cela équivaut au caractère « . » dans les expressions régulières complètes.
*Correspond à zéro ou plusieurs caractères quelconques. Cela équivaut à « .* » dans les expressions régulières complètes.
[...]Les ensembles de caractères peuvent être représentés entre crochets, comme dans les expressions régulières complètes. À l’intérieur de la classe de caractères, tout comme à l’extérieur, la barre oblique inversée n’a aucune signification particulière.

En mode « Wildcard », les caractères génériques ne peuvent pas être échappés. En mode « WildcardUnix », le caractère « \ » échappe le caractère générique.

Par exemple, si nous sommes en mode « Wildcard » et que nous avons des chaînes contenant des noms de fichiers, nous pourrions identifier les fichiers HTML avec *.html. Cela correspondra à zéro ou plusieurs caractères suivis d'un point, puis des lettres « h », « t », « m » et « l ».

Pour vérifier si une chaîne correspond à une expression avec caractères génériques, utilisez la fonction ` exactMatch()`. Par exemple :

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

Remarques à l'attention des utilisateurs de Perl

La plupart des abréviations de classes de caractères prises en charge par Perl le sont également par QRegExp ; voir characters and abbreviations for sets of characters.

Dans QRegExp, sauf au sein des classes de caractères, « ^ » désigne toujours le début de la chaîne ; il faut donc toujours échapper le caractère « ^ » (caret), sauf s'il est utilisé à cette fin. En Perl, la signification du caractère « ^ » varie automatiquement en fonction de son emplacement ; il est donc rarement nécessaire de l'échapper. Il en va de même pour « $ », qui, dans QRegExp, désigne toujours la fin de la chaîne.

Les quantificateurs de QRegExp sont identiques aux quantificateurs « gourmands » de Perl (mais voir la section « note above »). La correspondance non gourmande ne peut pas être appliquée à des quantificateurs individuels, mais peut l’être à l’ensemble des quantificateurs du motif. Par exemple, pour reproduire l’expression régulière Perl ro+?m, il faut écrire :

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

L'équivalent de l'option « /i » de Perl est « setCaseSensitivity » (Qt::CaseInsensitive).

L'option « /g » de Perl peut être émulée à l'aide d'un « loop ».

Dans QRegExp , . correspond à n'importe quel caractère ; par conséquent, toutes les expressions régulières QRegExp disposent d'un équivalent à l'option « /s » de Perl. QRegExp ne dispose pas d'équivalent à l'option « /m » de Perl, mais celle-ci peut être émulée de différentes manières, par exemple en divisant l'entrée en lignes ou en effectuant une boucle avec une expression régulière qui recherche les sauts de ligne.

QRegExp étant orienté chaînes de caractères, il n’existe pas d’assertions de type \A, \Z ou \z. L’assertion \G n’est pas prise en charge, mais peut être simulée à l’aide d’une boucle.

La variable $& de Perl correspond à cap(0) ou capturedTexts()[0]. Il n’existe pas d’équivalents QRegExp pour $`, $' ou $+. Les variables de capture de Perl, $1, $2, …, correspondent à cap(1) ou capturedTexts()[1], cap(2) ou capturedTexts()[2], etc.

Pour remplacer un motif, utilisez QString::replace().

La syntaxe étendue des expressions régulières de Perl n’est pas prise en charge, pas plus que les directives, par exemple (?i), ou les commentaires d’ /x s régulières, par exemple (?#comment). En revanche, les règles du C++ relatives aux chaînes littérales peuvent être utilisées pour obtenir le même résultat :

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

Les assertions d'anticipation positive et négative de largeur nulle (?=motif) et (?!motif) sont prises en charge avec la même syntaxe que dans Perl. Les assertions de rétrospection de Perl, les sous-expressions « indépendantes » et les expressions conditionnelles ne sont pas prises en charge.

Les parenthèses sans capture sont également prises en charge, avec la même syntaxe (?:motif).

Voir QString::split() et QStringList::join() pour les équivalents des fonctions split et join de Perl.

Remarque : comme le C++ transforme les \', ceux-ci doivent être écrits deux fois dans le code, par exemple \b doit s'écrire \\b.

Exemples de code

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)

La troisième chaîne correspond à «6 ». Il s'agit d'une expression régulière simple permettant de valider des nombres entiers compris entre 0 et 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)

La deuxième chaîne correspond à «This_is-OK ». Nous avons utilisé l'abréviation du jeu de caractères «\S » (sans espace) et les ancres pour trouver les chaînes ne contenant aucun espace.

Dans l'exemple suivant, nous recherchons des chaînes contenant « mail », « letter » ou « correspondence », mais uniquement des mots entiers, c'est-à-dire pas « 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

La deuxième chaîne correspond à « Please write the letter ». Le mot « letter » est également capturé (grâce aux parenthèses). Nous pouvons voir le texte que nous avons capturé comme suit :

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

Cela permettra de capturer le texte contenu entre la première paire de parenthèses de capture (en comptant les parenthèses de capture gauches de gauche à droite). Les parenthèses sont numérotées à partir de 1, car cap(0) correspond à l’expression régulière entière mise en correspondance (ce qui équivaut à « & » dans la plupart des moteurs d’expressions régulières).

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"

Ici, nous avons transmis l’objet QRegExp à la fonction replace() de QString afin de remplacer le texte correspondant par un nouveau texte.

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
    }
}

Nous avons utilisé la fonction indexIn() pour rechercher de manière répétée l’expression régulière dans la chaîne. Notez qu’au lieu d’avancer d’un caractère à la fois pos++, nous aurions pu écrire pos += rx.matchedLength() pour ignorer la partie de la chaîne déjà trouvée. Le nombre de occurrences sera égal à 3, correspondant à « One Eric another Eirik, and an Ericsson. Combien d’Eiriks, Eric? » ; il ne correspond pas à « Ericsson » ni à « Eiriks », car ces termes ne sont pas délimités par des limites de non-mots.

L’une des utilisations courantes des expressions régulières consiste à fractionner des lignes de données délimitées en leurs champs constitutifs.

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);
}

Dans cet exemple, nos lignes d’entrée se présentent sous la forme : nom de l’entreprise, adresse web et pays. Malheureusement, l’expression régulière est assez longue et peu polyvalente : le code cessera de fonctionner si nous ajoutons d’autres champs. Une solution plus simple et plus efficace consiste à rechercher le séparateur, «\t » dans ce cas précis, et à extraire le texte qui l'entoure. La fonction QString::split() peut prendre comme argument une chaîne de caractères ou une expression régulière servant de séparateur, et diviser une chaîne en conséquence.

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

Ici, field[0] correspond au nom de l'entreprise, field[1] à l'adresse web, et ainsi de suite.

Pour imiter le comportement d’un shell, on peut utiliser le mode « caractères génériques ».

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

La correspondance avec des caractères génériques peut être pratique en raison de sa simplicité, mais toute expression régulière utilisant des caractères génériques peut être définie à l’aide d’expressions régulières complètes, par exemple .*\.html$. Notez que nous ne pouvons pas faire correspondre à la fois les fichiers .html et .htm avec un caractère générique, à moins d'utiliser *.htm*, ce qui fera également correspondre « test.html.bak ». Une expression régulière complète nous offre la précision dont nous avons besoin : .*\.html?$.

QRegExp peut effectuer des correspondances sans distinction de casse à l’aide de ` setCaseSensitivity()` et peut utiliser une correspondance non gourmande, voir ` setMinimal()`. Par défaut, QRegExp utilise des expressions régulières complètes, mais cela peut être modifié avec ` setPatternSyntax()`. La recherche peut s’effectuer vers l’avant avec ` indexIn()` ou vers l’arrière avec ` lastIndexIn()`. On peut accéder au texte capturé à l’aide de capturedTexts(), qui renvoie une liste de toutes les chaînes capturées, ou à l’aide de cap(), qui renvoie la chaîne capturée correspondant à l’index donné. La fonction pos() prend un index de correspondance et renvoie la position dans la chaîne où la correspondance a été trouvée (ou -1 s’il n’y a pas eu de correspondance).

Portage vers QRegularExpression

La classe ` QRegularExpression `, introduite dans Qt 5, implémente des expressions régulières compatibles avec Perl et constitue une amélioration considérable par rapport à `QRegExp` en termes d’API proposées, de syntaxe de motifs prise en charge et de vitesse d’exécution. La principale différence réside dans le fait qu’ QRegularExpression se contente de contenir une expression régulière et n’ est pas modifiée lorsqu’une correspondance est demandée. À la place, un objet QRegularExpressionMatch est renvoyé, permettant de vérifier le résultat de la correspondance et d’extraire la sous-chaîne capturée. Il en va de même pour la correspondance globale et QRegularExpressionMatchIterator.

D'autres différences sont présentées ci-dessous.

Remarque : ` QRegularExpression ` ne prend pas en charge toutes les fonctionnalités disponibles dans les expressions régulières compatibles Perl. La plus notable est le fait que les noms en double pour les groupes de capture ne sont pas pris en charge, et leur utilisation peut entraîner un comportement indéfini. Cela pourrait changer dans une future version de Qt.

Syntaxe différente des motifs

Le portage d'une expression régulière de QRegExp vers QRegularExpression peut nécessiter des modifications du motif lui-même.

Dans certains cas précis, QRegExp était trop tolérant et acceptait des motifs qui sont tout simplement invalides avec l’ QRegularExpression. Ceux-ci sont faciles à détecter, car les objets QRegularExpression créés à partir de ces motifs ne sont pas valides (voir QRegularExpression::isValid()).

Dans d’autres cas, un motif porté de QRegExp vers QRegularExpression peut modifier silencieusement la sémantique. Il est donc nécessaire de revoir les motifs utilisés. Les cas les plus notables d’incompatibilité silencieuse sont les suivants :

  • Des accolades sont nécessaires pour utiliser une échappement hexadécimal tel que \xHHHH comportant plus de 2 chiffres. Un motif tel que \x2022 doit être porté vers \x{2022}, sinon il correspondra à un espace (0x20) suivi de la chaîne "22". En général, il est fortement recommandé de toujours utiliser des accolades avec l’échappement \x, quel que soit le nombre de chiffres spécifié.
  • Une quantification de 0 à n telle que {,n} doit être convertie en {0,n} pour préserver la sémantique. Sinon, un motif tel que \d{,3} correspondrait à un chiffre suivi de la chaîne exacte "{,3}".
  • Par défaut, QRegExp effectue une correspondance tenant compte de l’Unicode, tandis que QRegularExpression nécessite une option distincte ; voir ci-dessous pour plus de détails.
  • Dans QRegExp, « c{.} » correspond par défaut à tous les caractères, y compris le caractère de nouvelle ligne. QRegularExpression exclut par défaut le caractère de nouvelle ligne. Pour inclure le caractère de nouvelle ligne, définissez l’option de motif « QRegularExpression::DotMatchesEverythingOption ».

Pour un aperçu de la syntaxe des expressions régulières prise en charge par QRegularExpression, veuillez vous reporter à la page de manuel pcrepattern(3), qui décrit la syntaxe des motifs prise en charge par PCRE (l’implémentation de référence des expressions régulières compatibles Perl).

Portage depuis QRegExp::exactMatch()

QRegExp::exactMatch() remplissait deux fonctions : elle effectuait une correspondance exacte entre une expression régulière et une chaîne de caractères, et elle implémentait la correspondance partielle.

Portage de la correspondance exacte de QRegExp

La correspondance exacte indique si l'expression régulière correspond à l'intégralité de la chaîne de caractères. Par exemple, les classes renvoient les résultats suivants pour la chaîne « "abc123" » :

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

La correspondance exacte n'est pas prise en compte dans ` QRegularExpression`. Si vous souhaitez vous assurer que la chaîne de caractères correspond exactement à l'expression régulière, vous pouvez encapsuler le motif à l'aide de la fonction ` QRegularExpression::anchoredPattern()` :

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

// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));
Portage depuis la correspondance partielle de QRegExp

Lors de l'utilisation de QRegExp::exactMatch(), si aucune correspondance exacte n'a été trouvée, il est tout de même possible de déterminer la partie de la chaîne de caractères qui a été mise en correspondance avec l'expression régulière en appelant QRegExp::matchedLength(). Si la longueur renvoyée est égale à la longueur de la chaîne de caractères, on peut alors en conclure qu'une correspondance partielle a été trouvée.

QRegularExpression prend explicitement en charge la correspondance partielle grâce à la fonction appropriée QRegularExpression::MatchType.

Correspondance globale

En raison des limitations de l'API QRegExp, il n'a pas été possible d'implémenter correctement la correspondance globale (c'est-à-dire comme le fait Perl). En particulier, les motifs pouvant correspondre à 0 caractère (comme "a*") posent problème.

QRegularExpression::globalMatch() implémente correctement la correspondance globale de Perl, et l'itérateur renvoyé peut être utilisé pour examiner chaque résultat.

Par exemple, si vous avez un code tel que :

QString subject("the quick fox");

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

Vous pouvez le réécrire ainsi :

QString subject("the quick fox");

QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    // ...
}
Prise en charge des propriétés Unicode

Lorsque vous utilisez QRegExp, les classes de caractères telles que \w, \d, etc. correspondent aux caractères possédant la propriété Unicode correspondante : par exemple, \d correspond à tout caractère possédant la propriété Unicode « Nd » (chiffre décimal).

Par défaut, ces classes de caractères ne correspondent qu’aux caractères ASCII lorsqu’on utilise QRegularExpression: par exemple, \d correspond exactement à un caractère de la plage ASCII 0-9. Il est possible de modifier ce comportement en utilisant l’option de motif QRegularExpression::UseUnicodePropertiesOption.

Correspondance avec des caractères génériques

Il n’existe pas de moyen direct d’effectuer une correspondance avec des caractères génériques dans QRegularExpression. Cependant, la méthode QRegularExpression::wildcardToRegularExpression() est fournie pour traduire les motifs glob en une expression régulière compatible avec Perl pouvant être utilisée à cette fin.

Par exemple, si vous avez un code tel que :

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

Vous pouvez le réécrire ainsi :

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

Veuillez toutefois noter que certains motifs génériques de type « shell » peuvent ne pas être convertis comme vous vous y attendez. L'exemple de code suivant cessera de fonctionner sans avertissement s'il est simplement converti à l'aide de la fonction mentionnée ci-dessus :

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

En effet, par défaut, l'expression régulière renvoyée par QRegularExpression::wildcardToRegularExpression() est entièrement ancrée. Pour obtenir une expression régulière non ancrée, transmettez QRegularExpression::UnanchoredWildcardConversion comme option de conversion :

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

QRegExp::setMinimal() implémentait la correspondance minimale en inversant simplement la « gloutonnerie » des quantificateurs (QRegExp ne prenait pas en charge les quantificateurs paresseux, tels que *?, +?, etc.). QRegularExpression prend en revanche en charge les quantificateurs gloutons, paresseux et possessifs. L’option de motif « QRegularExpression::InvertedGreedinessOption » peut être utile pour émuler les effets de ` QRegExp::setMinimal()` : si elle est activée, elle inverse le comportement des quantificateurs (les quantificateurs gourmands deviennent paresseux et vice versa).

Modes Caret

L’option de correspondance « QRegularExpression::AnchorAtOffsetMatchOption » peut être utilisée pour émuler le comportement de « QRegExp::CaretAtOffset ». Il n’existe pas d’équivalent pour les autres modes de « QRegExp::CaretMode ».

Voir également QString, QStringList et QSortFilterProxyModel.

Documentation sur les types de membres

enum QRegExp::CaretMode

L'énumération CaretMode définit les différentes significations du signe « caret » (^) dans une expression régulière. Les valeurs possibles sont les suivantes :

ConstanteValeurDescription
QRegExp::CaretAtZero0Le signe « caret » correspond à l'index 0 dans la chaîne recherchée.
QRegExp::CaretAtOffset1Le signe « ^ » correspond au décalage de départ de la recherche.
QRegExp::CaretWontMatch2Le caractère « ^ » ne correspond jamais.

enum QRegExp::PatternSyntax

La syntaxe utilisée pour interpréter la signification du motif.

ConstanteValeurDescription
QRegExp::RegExp0Une syntaxe de correspondance de motifs riche, de type Perl. Il s'agit de la valeur par défaut.
QRegExp::RegExp23Semblable à RegExp, mais avec l'greedy quantifiers. (Introduit dans Qt 4.2.)
QRegExp::Wildcard1Cette option fournit une syntaxe de correspondance de motifs simple, similaire à celle utilisée par les shells (interpréteurs de commandes) pour le « file globbing ». Voir QRegExp wildcard matching.
QRegExp::WildcardUnix4Ceci est similaire à Wildcard, mais avec le comportement d'un shell Unix. Les caractères génériques peuvent être échappés à l'aide du caractère « \ ».
QRegExp::FixedString2Le motif est une chaîne fixe. Cela revient à appliquer le motif RegExp à une chaîne dans laquelle tous les méta-caractères sont échappés à l’aide de escape().
QRegExp::W3CXmlSchema115Le motif est une expression régulière telle que définie par la spécification W3C XML Schema 1.1.

Voir également la fonction setPatternSyntax().

Documentation des fonctions membres

QRegExp::QRegExp()

Crée une expression régulière vide.

Voir aussi isValid() et errorString().

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

Crée un objet d'expression régulière pour la chaîne « pattern » fournie. Le motif doit être spécifié en utilisant la notation avec caractères génériques si syntax est défini sur Wildcard; la valeur par défaut est RegExp. Le motif est sensible à la casse, sauf si cs est défini sur Qt::CaseInsensitive. La correspondance est « gloutonne » (maximale), mais peut être modifiée en appelant la fonction setMinimal().

Voir également setPattern(), setCaseSensitivity() et setPatternSyntax().

QRegExp::QRegExp(const QRegExp &rx)

Construit une expression régulière en tant que copie de rx.

Voir aussi operator=().

[noexcept] QRegExp::~QRegExp()

Supprime l'expression régulière et nettoie ses données internes.

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

Renvoie le texte capturé par la sous-expression « nth ». La correspondance complète porte l’index 0 et les sous-expressions entre parenthèses ont des indices commençant à 1 (à l’exclusion des parenthèses non capturantes).

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"
    // ...
}

L’ordre des éléments mis en correspondance par cap() est le suivant. Le premier élément, cap(0), correspond à la chaîne de correspondance dans son intégralité. Chaque élément suivant correspond à la parenthèse gauche ouvrante de capture suivante. Ainsi, cap(1) correspond au texte de la première parenthèse de capture, cap(2) à celui de la deuxième, et ainsi de suite.

Voir également capturedTexts() et pos().

int QRegExp::captureCount() const

Renvoie le nombre de captures contenues dans l'expression régulière.

QStringList QRegExp::capturedTexts() const

Renvoie une liste des chaînes de texte capturées.

La première chaîne de la liste correspond à la chaîne complète mise en correspondance. Chaque élément suivant de la liste contient une chaîne correspondant à une sous-expression (de capture) de l'expression régulière.

Par exemple :

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

L’exemple ci-dessus capture également des éléments qui peuvent être présents mais qui ne nous intéressent pas. Ce problème peut être résolu en utilisant des parenthèses sans capture :

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

Notez que si vous souhaitez parcourir la liste, vous devez le faire sur une copie, par exemple :

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

Certaines expressions régulières peuvent se faire correspondre un nombre indéterminé de fois. Par exemple, si la chaîne d’entrée est « Offsets: 12 14 99 231 7 » et que l’expression régulière, rx, est (\d+), on s’attendrait à obtenir une liste de tous les nombres correspondants. Cependant, après avoir appelé rx.indexIn(str), la fonction capturedTexts() renverra la liste (« 12 », « 12 »), c’est-à-dire que la correspondance complète était « 12 » et que la première sous-expression correspondante était « 12 ». L’approche correcte consiste à utiliser cap() dans une expression de type « loop ».

L’ordre des éléments dans la liste de chaînes est le suivant. Le premier élément est la chaîne de correspondance complète. Chaque élément suivant correspond à la parenthèse gauche ouvrante de capture suivante. Ainsi, capturedTexts()[1] correspond au texte de la première parenthèse ouvrante capturée, capturedTexts()[2] à celui de la deuxième, et ainsi de suite (ce qui correspond à $1, $2, etc., dans certains autres langages d’expressions régulières).

Voir également cap() et pos().

Qt::CaseSensitivity QRegExp::caseSensitivity() const

Renvoie « Qt::CaseSensitive » si l'expression régulière correspond (en tenant compte de la casse) ; sinon, renvoie « Qt::CaseInsensitive ».

Voir également setCaseSensitivity(), patternSyntax(), pattern() et isMinimal().

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

Renvoie le nombre de occurrences de cette expression régulière dans str.

Voir également indexIn(), lastIndexIn() et replaceIn().

QString QRegExp::errorString() const

Renvoie une chaîne de texte expliquant pourquoi un motif d'expression régulière n'est pas valide ; dans le cas contraire, renvoie « aucune erreur ne s'est produite ».

Voir également isValid().

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

Renvoie la chaîne « str », dans laquelle chaque caractère spécial des expressions régulières est échappé à l'aide d'une barre oblique inversée. Les caractères spéciaux sont : $, (,), *, +, ., ?, [, ,], ^, {, | et }.

Exemple :

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

Cette fonction est utile pour construire dynamiquement des motifs d'expressions régulières :

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

Voir aussi setPatternSyntax().

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

Renvoie « true » si l'expression régulière « str » correspond exactement à cette expression régulière ; sinon, renvoie « false ». Vous pouvez déterminer la longueur de la partie de la chaîne qui a été trouvée en appelant la fonction « matchedLength() ».

Pour une chaîne d’expression régulière R donnée, exactMatch("R") équivaut à indexIn("^R$") puisque exactMatch() encadre effectivement l’expression régulière entre les ancres de début et de fin de chaîne, à la différence près qu’il définit matchedLength() différemment.

Par exemple, si l’expression régulière est « blue », alors exactMatch() ne renvoie true que pour l’entrée blue. Pour les entrées bluebell, blutak et lightblue, exactMatch() renvoie false et matchedLength() renverra respectivement 4, 3 et 0.

Bien qu’elle soit de type const, cette fonction définit matchedLength(), capturedTexts() et pos().

Voir également indexIn() et lastIndexIn().

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

Renvoie une liste de toutes les chaînes de caractères qui correspondent à cette expression régulière dans stringList.

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

Renvoie l'index de la première correspondance exacte de cette expression régulière dans ` list`, en effectuant la recherche vers l'avant à partir de l'index ` from`. Renvoie -1 si aucun élément ne correspond.

Voir également lastIndexIn() et exactMatch().

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

Tente de trouver une correspondance dans ` str ` à partir de la position ` offset ` (0 par défaut). Si ` offset ` est égal à -1, la recherche commence au dernier caractère ; s'il est égal à -2, à l'avant-dernier caractère ; etc.

Renvoie la position de la première correspondance, ou -1 s'il n'y a pas eu de correspondance.

Le paramètre caretMode permet de préciser si le caractère ^ doit correspondre à l’index 0 ou à offset.

Vous préférerez peut-être utiliser ` QString::indexOf()`, ` QString::contains()` ou même ` QStringList::filter()`. Pour remplacer les occurrences, utilisez ` QString::replace()`.

Exemple :

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

Bien qu'elle soit constante, cette fonction définit matchedLength(), capturedTexts() et pos().

Si l'expression « QRegExp » est une expression générique (voir setPatternSyntax()) et que vous souhaitez comparer une chaîne à l'ensemble de cette expression générique, utilisez exactMatch() à la place de cette fonction.

Voir également lastIndexIn() et exactMatch().

bool QRegExp::isEmpty() const

Renvoie « true » si la chaîne de motif est vide ; sinon, renvoie « false ».

Si vous appelez ` exactMatch()` avec un motif vide sur une chaîne vide, la fonction renvoie `true` ; sinon, elle renvoie ` false `, car elle porte sur l'intégralité de la chaîne. Si vous appelez indexIn() avec un motif vide sur une chaîne quelconque, la fonction renvoie le décalage de départ (0 par défaut) car le motif vide correspond au « vide » au début de la chaîne. Dans ce cas, la longueur de la correspondance renvoyée par matchedLength() sera de 0.

Voir QString::isEmpty().

bool QRegExp::isMinimal() const

Renvoie true si la correspondance minimale (non gloutonne) est activée ; sinon, renvoie false.

Voir également caseSensitivity() et setMinimal().

bool QRegExp::isValid() const

Renvoie « true » si l'expression régulière est valide ; sinon, renvoie « false ». Une expression régulière non valide ne correspond jamais.

Le motif [a-z] est un exemple de motif non valide, car il manque un crochet fermant.

Notez que la validité d’une expression régulière peut également dépendre de l’activation du drapeau « wildcard » ; par exemple, *.html est une expression régulière valide avec des caractères génériques, mais une expression régulière complète non valide.

Voir également errorString().

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

Renvoie l'index de la dernière correspondance exacte de cette expression régulière dans ` list`, en effectuant une recherche vers l'arrière à partir de l'index ` from`. Si ` from ` est égal à -1 (valeur par défaut), la recherche commence à partir du dernier élément. Renvoie -1 si aucun élément ne correspond.

Voir aussi QRegExp::exactMatch().

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

Tente de trouver une correspondance en remontant dans la chaîne « str » à partir de la position « offset ». Si « offset » est égal à -1 (valeur par défaut), la recherche commence au dernier caractère ; s’il est égal à -2, à l’avant-dernier caractère ; etc.

Renvoie la position de la première correspondance, ou -1 s'il n'y a pas eu de correspondance.

Le paramètre ` caretMode ` permet de préciser si le caractère ^ doit correspondre à l’index 0 ou à ` offset`.

Bien qu’elle soit de type const, cette fonction définit les paramètres matchedLength(), capturedTexts() et pos().

Avertissement : la recherche en arrière est beaucoup plus lente que la recherche en avant.

Voir également indexIn() et exactMatch().

int QRegExp::matchedLength() const

Renvoie la longueur de la dernière chaîne trouvée, ou -1 s'il n'y a pas eu de correspondance.

Voir également exactMatch(), indexIn() et lastIndexIn().

QString QRegExp::pattern() const

Renvoie la chaîne de motif de l'expression régulière. Le motif utilise soit la syntaxe des expressions régulières, soit la syntaxe des caractères génériques, selon la valeur de patternSyntax().

Voir également setPattern(), patternSyntax() et caseSensitivity().

QRegExp::PatternSyntax QRegExp::patternSyntax() const

Renvoie la syntaxe utilisée par l'expression régulière. La valeur par défaut est « QRegExp::RegExp ».

Voir également setPatternSyntax(), pattern() et caseSensitivity().

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

Renvoie la position du texte capturé par l'nth e dans la chaîne recherchée. Si nth vaut 0 (valeur par défaut), la fonction pos() renvoie la position de la correspondance complète.

Exemple :

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)

Pour les correspondances de longueur nulle, pos() renvoie toujours -1. (Par exemple, si cap(4) renvoie une chaîne vide, pos(4) renvoie -1.) Il s'agit d'une particularité de l'implémentation.

Voir également cap() et capturedTexts().

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

Supprime toutes les occurrences de l'expression régulière str et renvoie le résultat

Fonctionne de la même manière que replaceIn(str, QString()).

Voir également indexIn(), lastIndexIn() et replaceIn().

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

Remplace chaque occurrence de cette expression régulière dans str par after et renvoie le résultat.

Pour les expressions régulières contenant « capturing parentheses », les occurrences de \1, \2, …, dans after sont remplacées par rx.cap(1), cap(2), …

Voir également indexIn(), lastIndexIn() et QRegExp::cap().

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

Remplace chaque occurrence de cette expression régulière, dans chacune des entrées de stringList, par after. Renvoie une référence à la liste de chaînes.

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

Définit la correspondance sensible à la casse sur « cs ».

Si cs est Qt::CaseSensitive, \.txt$ correspond à readme.txt mais pas à README.TXT.

Voir également caseSensitivity(), setPatternSyntax(), setPattern() et setMinimal().

void QRegExp::setMinimal(bool minimal)

Active ou désactive la correspondance minimale. Si la valeur de « minimal » est « false », la correspondance est gloutonne (maximale), ce qui correspond au comportement par défaut.

Par exemple, supposons que nous ayons la chaîne d'entrée « We must be <b>bold</b>, very <b>bold</b>! » et le motif <b>.*</b>. Avec la correspondance gloutonne (maximale) par défaut, la correspondance est « We must be <b>bold</b>, very <b>bold</b>! ». Mais avec la correspondance minimale (non gourmande), la première correspondance est : « We must be <b>bold</b>, very <b>bold</b> ! » et la deuxième correspondance est « We must be <b>bold</b>, very <b>bold</b>! ». En pratique, on pourrait utiliser à la place le motif <b>[^<]*</b>, bien que cela échoue toujours pour les balises imbriquées.

Voir également isMinimal() et setCaseSensitivity().

void QRegExp::setPattern(const QString &pattern)

Définit la chaîne de motif sur pattern. Les options relatives à la distinction entre majuscules et minuscules, aux caractères génériques et à la correspondance minimale ne sont pas modifiées.

Voir également pattern(), setPatternSyntax() et setCaseSensitivity().

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

Définit le mode syntaxique de l'expression régulière. La valeur par défaut est « QRegExp::RegExp ».

En définissant ` syntax ` sur ` QRegExp::Wildcard `, on active l'QRegExp wildcard matching simple de type shell. Par exemple, `r*.txt` correspond à la chaîne ` readme.txt ` en mode caractère générique, mais ne correspond pas à ` readme`.

Définir syntax sur QRegExp::FixedString signifie que le motif est interprété comme une chaîne de caractères simple. Les caractères spéciaux (par exemple, la barre oblique inversée) n'ont alors pas besoin d'être échappés.

Voir également patternSyntax(), setPattern(), setCaseSensitivity() et escape().

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

La fonction `split()` divise la chaîne ` str ` en sous-chaînes à chaque occurrence de cette expression régulière et renvoie la liste de ces sous-chaînes. Si cette expression régulière ne correspond à aucun élément de la chaîne, la fonction `split()` renvoie une liste à un seul élément contenant ` str`.

Si behavior est défini sur Qt::KeepEmptyParts, les champs vides sont inclus dans la liste résultante.

Voir également QStringList::join() et QString::split().

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

Remplace l'other d'expression régulière par cette expression régulière. Cette opération est très rapide et ne rencontre jamais d'échec.

QRegExp::operator QVariant() const

Renvoie l'expression régulière sous la forme d'un QVariant

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

Renvoie « true » si cette expression régulière n'est pas égale à « rx » ; sinon, renvoie « false ».

Voir aussi operator==().

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

Cette opération attribue l'other à cette instance QRegExp.

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

Copie l'expression régulière rx et renvoie une référence à cette copie. Les options relatives à la distinction entre majuscules et minuscules, aux caractères génériques et à la correspondance minimale sont également copiées.

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

Renvoie « true » si cette expression régulière est égale à « rx » ; sinon, renvoie « false ».

Deux objets ` QRegExp ` sont égaux s’ils possèdent les mêmes chaînes de motif et les mêmes paramètres concernant la sensibilité à la casse, les caractères génériques et la correspondance minimale.

Éléments non membres associés

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

Renvoie la valeur de hachage de key, en utilisant seed comme graine pour le calcul.

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

Écrit l'expression régulière regExp dans le flux out.

Voir également Sérialisation des types de données Qt.

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

Lit une expression régulière à partir du flux in et la stocke dans regExp.

Voir également Sérialisation des types de données Qt.

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