QRegularExpression Class
La classe QRegularExpression permet la recherche de motifs à l'aide d'expressions régulières. Plus d'informations...
| En-tête : | #include <QRegularExpression> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
- Liste de tous les membres, y compris les membres hérités
- Membres dépréciés
- QRegularExpression fait partie des classes partagées implicitement et des classes pour les données de type chaîne.
Cette classe est comparable à l'égalité.
Remarque : Toutes les fonctions de cette classe sont réentrantes.
Types publics
| enum | MatchOption { NoMatchOption, AnchoredMatchOption, AnchorAtOffsetMatchOption, DontCheckSubjectStringMatchOption } |
| flags | MatchOptions |
| enum | MatchType { NormalMatch, PartialPreferCompleteMatch, PartialPreferFirstMatch, NoMatch } |
| enum | PatternOption { NoPatternOption, CaseInsensitiveOption, DotMatchesEverythingOption, MultilineOption, ExtendedPatternSyntaxOption, …, UseUnicodePropertiesOption } |
| flags | PatternOptions |
(since 6.0) enum | WildcardConversionOption { DefaultWildcardConversion, UnanchoredWildcardConversion, NonPathWildcardConversion } |
| flags | WildcardConversionOptions |
Fonctions publiques
| QRegularExpression() | |
| QRegularExpression(const QString &pattern, QRegularExpression::PatternOptions options = NoPatternOption) | |
| QRegularExpression(const QRegularExpression &re) | |
(since 6.1) | QRegularExpression(QRegularExpression &&re) |
| ~QRegularExpression() | |
| int | captureCount() const |
| QString | errorString() const |
| QRegularExpressionMatchIterator | globalMatch(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
(since 6.5) QRegularExpressionMatchIterator | globalMatchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
| bool | isValid() const |
| QRegularExpressionMatch | match(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
(since 6.5) QRegularExpressionMatch | matchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
| QStringList | namedCaptureGroups() const |
| void | optimize() const |
| QString | pattern() const |
| qsizetype | patternErrorOffset() const |
| QRegularExpression::PatternOptions | patternOptions() const |
| void | setPattern(const QString &pattern) |
| void | setPatternOptions(QRegularExpression::PatternOptions options) |
| void | swap(QRegularExpression &other) |
| QRegularExpression & | operator=(QRegularExpression &&re) |
| QRegularExpression & | operator=(const QRegularExpression &re) |
Membres publics statiques
| QString | anchoredPattern(QStringView expression) |
| QString | anchoredPattern(const QString &expression) |
| QString | escape(QStringView str) |
| QString | escape(const QString &str) |
(since 6.0) QRegularExpression | fromWildcard(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseInsensitive, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
| QString | wildcardToRegularExpression(QStringView pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
| QString | wildcardToRegularExpression(const QString &pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
Non-membres apparentés
| size_t | qHash(const QRegularExpression &key, size_t seed = 0) |
| bool | operator!=(const QRegularExpression &lhs, const QRegularExpression &rhs) |
| QDataStream & | operator<<(QDataStream &out, const QRegularExpression &re) |
| QDebug | operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions) |
| QDebug | operator<<(QDebug debug, const QRegularExpression &re) |
| bool | operator==(const QRegularExpression &lhs, const QRegularExpression &rhs) |
| QDataStream & | operator>>(QDataStream &in, QRegularExpression &re) |
Description détaillée
Les expressions régulières, ou regexps, sont un outil très puissant pour manipuler des chaînes de caractères et des textes. Cela est utile dans de nombreux contextes, par exemple,
| Validation | Une expression rationnelle peut tester si une sous-chaîne répond à certains critères, par exemple s'il s'agit d'un nombre entier ou si elle ne contient pas d'espace. |
| Recherche | Une expression rationnelle permet d'effectuer des recherches plus puissantes que la simple comparaison de sous-chaînes, par exemple, faire correspondre l'un des mots mail, lettre ou correspondance, mais aucun des mots email, mailman, mailer, letterbox, etc. |
| Rechercher et remplacer | Une expression rationnelle peut remplacer toutes les occurrences d'une sous-chaîne par une sous-chaîne différente, par exemple, remplacer toutes les occurrences de & par & ; sauf si le & est déjà suivi d'un amp ;. |
| Fractionnement de chaînes | Une expression rationnelle peut être utilisée pour identifier l'endroit où une chaîne doit être séparée, par exemple pour séparer des chaînes délimitées par des tabulations. |
Ce document n'est en aucun cas une référence complète sur la recherche de motifs à l'aide d'expressions régulières, et les parties suivantes nécessiteront de la part du lecteur des connaissances de base sur les expressions régulières de type Perl et leur syntaxe de motifs.
Parmi les bonnes références sur les expressions régulières, on peut citer
- Mastering Regular Expressions (troisième édition) par Jeffrey E. F. Friedl, ISBN 0-596-52812-4 ;
- 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 avec Perl) ;
- la documentation sur les expressions régulières de Perl et le tutoriel sur les expressions régulières de Perl.
Introduction
QRegularExpression implémente les expressions régulières compatibles avec Perl. Il supporte entièrement l'Unicode. Pour une vue d'ensemble de la syntaxe des expressions régulières supportée par QRegularExpression, veuillez vous référer à la page de manuel pcrepattern(3) mentionnée plus haut. Une expression régulière se compose de deux éléments : une chaîne de motifs et un ensemble d'options de motifs qui modifient la signification de la chaîne de motifs.
Vous pouvez définir la chaîne de motifs en passant une chaîne au constructeur de QRegularExpression :
QRegularExpression re("a pattern");
Ceci définit la chaîne de motifs à a pattern. Vous pouvez également utiliser la fonction setPattern() pour définir un motif sur un objet QRegularExpression existant :
QRegularExpression re; re.setPattern("another pattern");
Notez qu'en raison des règles relatives aux chaînes littérales du C++, vous devez échapper à toutes les barres obliques inverses à l'intérieur de la chaîne de motifs par une autre barre oblique inversée :
// matches two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); // matches a backslash QRegularExpression re2("\\\\");
Vous pouvez également utiliser une chaîne littérale brute, auquel cas vous n'avez pas besoin d'échapper aux barres obliques inverses dans le motif, tous les caractères entre R"(...)" étant considérés comme des caractères bruts. Comme vous pouvez le voir dans l'exemple suivant, cela simplifie l'écriture des motifs :
// matches two digits followed by a space and a word QRegularExpression re(R"(\d\d \w+)");
La fonction pattern() renvoie le motif actuellement défini pour un objet QRegularExpression :
QRegularExpression re("a third pattern"); QString pattern = re.pattern(); // pattern == "a third pattern"
Options de motif
La signification de la chaîne de motifs peut être modifiée en définissant une ou plusieurs options de motifs. Par exemple, il est possible de configurer un motif pour qu'il corresponde insensiblement à la casse en définissant l'option QRegularExpression::CaseInsensitiveOption.
Vous pouvez définir les options en les passant au constructeur de QRegularExpression, comme dans l'exemple suivant :
// matches "Qt rocks", but also "QT rocks", "QT ROCKS", "qT rOcKs", etc. QRegularExpression re("Qt rocks", QRegularExpression::CaseInsensitiveOption);
Vous pouvez également utiliser la fonction setPatternOptions() sur un objet QRegularExpressionObject existant :
QRegularExpression re("^\\d+$"); re.setPatternOptions(QRegularExpression::MultilineOption); // re matches any line in the subject string that contains only digits (but at least one)
Il est possible d'obtenir les options de motif actuellement définies sur un objet QRegularExpression en utilisant la fonction patternOptions() :
QRegularExpression re = QRegularExpression("^two.*words$", QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption); QRegularExpression::PatternOptions options = re.patternOptions(); // options == QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption
Veuillez vous référer à la documentation de l'enum QRegularExpression::PatternOption pour plus d'informations sur chaque option de motif.
Type de correspondance et options de correspondance
Les deux derniers arguments des fonctions match() et globalMatch() définissent le type de correspondance et les options de correspondance. Le type de correspondance est une valeur de l'énumération QRegularExpression::MatchType; l'algorithme de correspondance "traditionnel" est choisi en utilisant le type de correspondance NormalMatch (par défaut). Il est également possible d'activer une correspondance partielle de l'expression régulière par rapport à une chaîne de caractères : voir la section partial matching pour plus de détails.
Les options de correspondance sont un ensemble d'une ou plusieurs valeurs QRegularExpression::MatchOption. Elles modifient la manière dont une expression régulière est comparée à une chaîne de caractères. Veuillez consulter la documentation de l'énumération QRegularExpression::MatchOption pour plus de détails.
Correspondance normale
Pour effectuer une correspondance, il suffit d'invoquer la fonction match() en lui transmettant une chaîne de caractères à comparer. Nous appelons cette chaîne la chaîne du sujet. Le résultat de la fonction match() est un objet QRegularExpressionMatch qui peut être utilisé pour inspecter les résultats de la correspondance. Par exemple :
// match two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); bool hasMatch = match.hasMatch(); // true
Si la correspondance est réussie, le numéro de groupe de capture (implicite) 0 peut être utilisé pour récupérer la sous-chaîne correspondant à l'ensemble du motif (voir également la section concernant extracting captured substrings) :
QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "23 def" // ... }
Il est également possible de commencer une recherche à un emplacement arbitraire dans la chaîne du sujet en passant l'emplacement en tant qu'argument de la fonction match(). Dans l'exemple suivant, "12 abc" n'est pas pris en compte parce que la correspondance est lancée à l'offset 1 :
QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("12 abc 45 def", 1); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "45 def" // ... }
Extraction des sous-chaînes capturées
L'objet QRegularExpressionMatch contient également des informations sur les sous-chaînes capturées par les groupes de capture dans la chaîne de motifs. La fonction captured() renvoie la chaîne capturée par le n-ième groupe de capture :
QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$"); QRegularExpressionMatch match = re.match("08/12/1985"); if (match.hasMatch()) { QString day = match.captured(1); // day == "08" QString month = match.captured(2); // month == "12" QString year = match.captured(3); // year == "1985" // ... }
Les groupes de capture dans le motif sont numérotés à partir de 1, et le groupe de capture implicite 0 est utilisé pour capturer la sous-chaîne qui correspond à l'ensemble du motif.
Il est également possible de récupérer les décalages de début et de fin (à l'intérieur de la chaîne du sujet) de chaque sous-chaîne capturée, en utilisant les fonctions capturedStart() et capturedEnd() :
QRegularExpression re("abc(\\d+)def"); QRegularExpressionMatch match = re.match("XYZabc123defXYZ"); if (match.hasMatch()) { int startOffset = match.capturedStart(1); // startOffset == 6 int endOffset = match.capturedEnd(1); // endOffset == 9 // ... }
Toutes ces fonctions ont une surcharge prenant un QString comme paramètre afin d'extraire les sous-chaînes capturées nommées. Par exemple :
QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"); QRegularExpressionMatch match = re.match("08/12/1985"); if (match.hasMatch()) { QString date = match.captured("date"); // date == "08" QString month = match.captured("month"); // month == "12" QString year = match.captured("year"); // year == 1985 }
Correspondance globale
Lacorrespondance globale est utile pour trouver toutes les occurrences d'une expression régulière donnée à l'intérieur d'une chaîne de caractères. Supposons que nous voulions extraire tous les mots d'une chaîne donnée, où un mot est une sous-catégorie correspondant au modèle \w+.
QRegularExpression::globalMatch renvoie un QRegularExpressionMatchIterator, qui est un itérateur de type Java qui peut être utilisé pour itérer sur les résultats. Par exemple :
QRegularExpression re("(\\w+)"); QRegularExpressionMatchIterator i = re.globalMatch("the quick fox");
Comme il s'agit d'un itérateur de type Java, l'adresse QRegularExpressionMatchIterator pointera immédiatement avant le premier résultat. Chaque résultat est renvoyé sous la forme d'un objet QRegularExpressionMatch. La fonction hasNext() renvoie un vrai résultat s'il y en a au moins un de plus, et next() renvoie le résultat suivant et fait avancer l'itérateur. Reprenons l'exemple précédent :
QStringList words; while (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString word = match.captured(1); words << word; } // words contains "the", "quick", "fox"
Vous pouvez également utiliser peekNext() pour obtenir le résultat suivant sans faire avancer l'itérateur.
Il est également possible d'utiliser simplement le résultat de QRegularExpression::globalMatch dans une boucle for basée sur l'intervalle, par exemple comme ceci :
// using a raw string literal, R"(raw_characters)", to be able to use "\w" // without having to escape the backslash as "\\w" QRegularExpression re(R"(\w+)"); QString subject("the quick fox"); for (const QRegularExpressionMatch &match : re.globalMatch(subject)) { // ... }
Il est possible de passer un décalage de départ et une ou plusieurs options de correspondance à la fonction globalMatch(), exactement comme une correspondance normale avec match().
Correspondance partielle
Une correspondance partielle est obtenue lorsque la fin de la chaîne de caractères du sujet est atteinte, mais que d'autres caractères sont nécessaires pour compléter la correspondance. Notez qu'une correspondance partielle est généralement beaucoup plus inefficace qu'une correspondance normale, car de nombreuses optimisations de l'algorithme de correspondance ne peuvent pas être utilisées.
Une correspondance partielle doit être explicitement demandée en spécifiant un type de correspondance de PartialPreferCompleteMatch ou PartialPreferFirstMatch lors de l'appel à QRegularExpression::match ou QRegularExpression::globalMatch. Si une correspondance partielle est trouvée, l'appel à la fonction hasMatch() sur l'objet QRegularExpressionMatch renvoyé par match() renverra false, mais hasPartialMatch() renverra true.
Lorsqu'une correspondance partielle est trouvée, aucune sous-chaîne capturée n'est renvoyée et le groupe de capture 0 (implicite) correspondant à la correspondance complète capture la sous-chaîne partiellement correspondante de la chaîne de l'objet.
Notez que le fait de demander une correspondance partielle peut toujours conduire à une correspondance complète, si elle est trouvée ; dans ce cas, hasMatch() renverra true et hasPartialMatch() false. Il n'arrive jamais qu'un site QRegularExpressionMatch signale à la fois une correspondance partielle et une correspondance complète.
La correspondance partielle est principalement utile dans deux scénarios : la validation de l'entrée de l'utilisateur en temps réel et la correspondance incrémentale/multi-segments.
Validation de l'entrée utilisateur
Supposons que nous souhaitions que l'utilisateur saisisse une date dans un format spécifique, par exemple "MMM jj, aaaa". Nous pouvons vérifier la validité de l'entrée à l'aide d'un modèle tel que :
^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, \d\d\d\d$
(Ce motif ne prend pas en compte les jours invalides, mais gardons-le pour les besoins de l'exemple).
Nous aimerions valider l'entrée avec cette expression régulière pendant que l'utilisateur la tape, afin de pouvoir signaler une erreur dans l'entrée dès qu'elle est commise (par exemple, l'utilisateur a tapé la mauvaise touche). Pour ce faire, nous devons distinguer trois cas :
- l'entrée ne peut pas correspondre à l'expression régulière ;
- l'entrée correspond à l'expression régulière ;
- l'entrée ne correspond pas à l'expression régulière pour l'instant, mais elle y correspondra si d'autres caractères y sont ajoutés.
Notez que ces trois cas représentent exactement les états possibles d'un site QValidator (voir l'énumération QValidator::State ).
En particulier, dans le dernier cas, nous voulons que le moteur d'expressions régulières signale une correspondance partielle : nous parvenons à faire correspondre le motif à la chaîne du sujet, mais la correspondance ne peut pas se poursuivre parce que la fin du sujet est rencontrée. Notez cependant que l'algorithme de correspondance doit continuer et essayer toutes les possibilités, et dans le cas où une correspondance complète (non partielle) est trouvée, celle-ci doit être signalée, et la chaîne d'entrée doit être acceptée comme entièrement valide.
Ce comportement est mis en œuvre par le type de correspondance PartialPreferCompleteMatch. Par exemple :
QString pattern("^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d\\d?, \\d\\d\\d\\d$"); QRegularExpression re(pattern); QString input("Jan 21,"); QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
Si la correspondance entre la même expression régulière et la chaîne du sujet aboutit à une correspondance complète, elle est signalée comme d'habitude :
QString input("Dec 8, 1985"); QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // true bool hasPartialMatch = match.hasPartialMatch(); // false
Un autre exemple avec un motif différent, montrant le comportement qui consiste à préférer une correspondance complète à une correspondance partielle :
QRegularExpression re("abc\\w+X|def"); QRegularExpressionMatch match = re.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // true bool hasPartialMatch = match.hasPartialMatch(); // false QString captured = match.captured(0); // captured == "def"
Dans ce cas, le sous-motif abc\\w+X correspond partiellement à la chaîne du sujet ; cependant, le sous-motif def correspond complètement à la chaîne du sujet, et une correspondance complète est donc signalée.
Si plusieurs correspondances partielles sont trouvées lors de la recherche (mais pas de correspondance complète), l'objet QRegularExpressionMatch signalera la première trouvée. Par exemple :
QRegularExpression re("abc\\w+X|defY"); QRegularExpressionMatch match = re.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true QString captured = match.captured(0); // captured == "abcdef"
Correspondance incrémentale/multi-segments
La correspondance incrémentielle est un autre cas d'utilisation de la correspondance partielle. Supposons que nous voulions trouver les occurrences d'une expression régulière dans un texte volumineux (c'est-à-dire les sous-chaînes correspondant à l'expression régulière). Pour ce faire, nous aimerions "alimenter" les moteurs d'expressions régulières en petits morceaux. Le problème évident est de savoir ce qui se passe si la sous-chaîne qui correspond à l'expression régulière s'étend sur deux ou plusieurs morceaux.
Dans ce cas, le moteur d'expressions régulières doit signaler une correspondance partielle, de sorte que nous puissions procéder à une nouvelle correspondance en ajoutant de nouvelles données et obtenir (éventuellement) une correspondance complète. Cela implique que le moteur d'expressions régulières peut supposer qu'il y a d'autres caractères au-delà de la fin de la chaîne du sujet. Cela ne doit pas être pris au pied de la lettre : le moteur n'essaiera jamais d'accéder à un caractère après le dernier du sujet.
QRegularExpression met en œuvre ce comportement lors de l'utilisation du type de correspondance PartialPreferFirstMatch. Ce type de correspondance signale une correspondance partielle dès qu'elle est trouvée, et les autres alternatives de correspondance ne sont pas essayées (même si elles pourraient conduire à une correspondance complète). Par exemple :
QRegularExpression re("abc|ab"); QRegularExpressionMatch match = re.match("ab", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
Cela se produit parce qu'en faisant correspondre la première branche de l'opérateur d'alternance, une correspondance partielle est trouvée, et donc la correspondance s'arrête, sans essayer la deuxième branche. Autre exemple :
QRegularExpression re("abc(def)?"); QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
Ceci montre ce qui pourrait sembler être un comportement contre-intuitif des quantificateurs : puisque ? est gourmand, le moteur essaie d'abord de poursuivre la recherche après avoir trouvé "abc"; mais la recherche atteint alors la fin de la chaîne du sujet, et une recherche partielle est donc signalée. Ce comportement est encore plus surprenant dans l'exemple suivant :
QRegularExpression re("(abc)*"); QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
Il est facile de comprendre ce comportement si nous nous rappelons que le moteur s'attend à ce que la chaîne du sujet ne soit qu'une sous-chaîne du texte entier dans lequel nous cherchons une correspondance (c'est-à-dire, comme nous l'avons dit précédemment, que le moteur suppose qu'il y a d'autres caractères au-delà de la fin de la chaîne du sujet).
Comme le quantificateur * est gourmand, signaler une correspondance complète pourrait être une erreur, car après le sujet actuel "abc", il peut y avoir d'autres occurrences de "abc". Par exemple, le texte complet aurait pu être "abcabcX", et donc la bonne correspondance à signaler (dans le texte complet) aurait été "abcabc"; en ne correspondant qu'au "abc" de tête, nous obtenons une correspondance partielle.
Gestion des erreurs
Il est possible qu'un objet QRegularExpression soit invalide en raison d'erreurs de syntaxe dans la chaîne de caractères. La fonction isValid() renvoie un message vrai si l'expression régulière est valide, ou faux dans le cas contraire :
QRegularExpression invalidRe("(unmatched|parenthesis"); bool isValid = invalidRe.isValid(); // false
Vous pouvez obtenir plus d'informations sur l'erreur spécifique en appelant la fonction errorString() ; en outre, la fonction patternErrorOffset() renverra le décalage dans la chaîne de caractères.
QRegularExpression invalidRe("(unmatched|parenthesis"); if (!invalidRe.isValid()) { QString errorString = invalidRe.errorString(); // errorString == "missing )" int errorOffset = invalidRe.patternErrorOffset(); // errorOffset == 22 // ... }
Si une correspondance est tentée avec une QRegularExpression invalide, l'objet QRegularExpressionMatch renvoyé sera également invalide (c'est-à-dire que sa fonction isValid() renverra false). Il en va de même pour les tentatives de correspondance globale.
Fonctionnalités non prises en charge des expressions régulières compatibles avec Perl
QRegularExpression ne prend pas en charge toutes les fonctionnalités disponibles dans les expressions régulières compatibles avec Perl. La plus notable est le fait que les noms dupliqués pour les groupes de capture ne sont pas pris en charge, et leur utilisation peut conduire à un comportement indéfini.
Cela pourrait changer dans une future version de Qt.
Débogage du code qui utilise QRegularExpression
QRegularExpression utilise en interne un compilateur juste à temps (JIT) pour optimiser l'exécution de l'algorithme de correspondance. Le JIT fait un usage intensif du code auto-modifiant, ce qui peut faire planter des outils de débogage tels que Valgrind. Vous devez activer toutes les vérifications du code auto-modifiant si vous voulez déboguer des programmes utilisant QRegularExpression (par exemple, l'option de ligne de commande --smc-check de Valgrind). L'inconvénient de l'activation de ces contrôles est que votre programme s'exécutera beaucoup plus lentement.
Pour éviter cela, le JIT est désactivé par défaut si vous compilez Qt en mode débogage. Il est possible d'outrepasser la valeur par défaut et d'activer ou de désactiver l'utilisation de l'ITC (à la fois en mode debug ou release) en définissant la variable d'environnement QT_ENABLE_REGEXP_JIT à une valeur non nulle ou nulle respectivement.
Voir également QRegularExpressionMatch et QRegularExpressionMatchIterator.
Documentation sur les types de membres
enum QRegularExpression::MatchOption
flags QRegularExpression::MatchOptions
| Constante | Valeur | Description de la constante |
|---|---|---|
QRegularExpression::NoMatchOption | 0x0000 | Aucune option de correspondance n'est définie. |
QRegularExpression::AnchoredMatchOption | AnchorAtOffsetMatchOption | Utilisez AnchorAtOffsetMatchOption à la place. |
QRegularExpression::AnchorAtOffsetMatchOption | 0x0001 | La correspondance est contrainte de commencer exactement au décalage passé à match() pour réussir, même si la chaîne de motifs ne contient aucun métacaractère qui ancre la correspondance à ce point. Notez que le passage de cette option n'ancre pas la fin de la correspondance à la fin du sujet ; si vous voulez ancrer complètement une expression régulière, utilisez anchoredPattern(). Cette valeur a été introduite dans Qt 6.0. |
QRegularExpression::DontCheckSubjectStringMatchOption | 0x0002 | La validité de la chaîne du sujet n'est pas vérifiée en UTF-16 avant de tenter une correspondance. Utilisez cette option avec une extrême prudence, car une tentative de correspondance avec une chaîne non valide peut faire planter le programme et/ou constituer un problème de sécurité. Cette valeur d'énumération a été introduite dans Qt 5.4. |
Le type MatchOptions est un typedef pour QFlags<MatchOption>. Il stocke une combinaison OR de valeurs MatchOption.
enum QRegularExpression::MatchType
L'énumération MatchType définit le type de correspondance qui doit être tentée avec la chaîne de l'objet.
| Constante | Valeur | Description |
|---|---|---|
QRegularExpression::NormalMatch | 0 | Une correspondance normale est effectuée. |
QRegularExpression::PartialPreferCompleteMatch | 1 | La chaîne de motifs est partiellement comparée à la chaîne de l'objet. Si une correspondance partielle est trouvée, elle est enregistrée et d'autres alternatives de correspondance sont essayées comme d'habitude. Si une correspondance complète est trouvée, elle est préférée à la correspondance partielle ; dans ce cas, seule la correspondance complète est signalée. Si, au contraire, aucune correspondance complète n'est trouvée (mais seulement une correspondance partielle), c'est la correspondance partielle qui est signalée. |
QRegularExpression::PartialPreferFirstMatch | 2 | La chaîne de motifs est comparée partiellement à la chaîne de l'objet. Si une correspondance partielle est trouvée, la recherche s'arrête et la correspondance partielle est signalée. Dans ce cas, les autres possibilités de correspondance (qui pourraient conduire à une correspondance complète) ne sont pas essayées. En outre, ce type de correspondance suppose que la chaîne du sujet n'est qu'une sous-chaîne d'un texte plus large et que (dans ce texte) il y a d'autres caractères au-delà de la fin de la chaîne du sujet. Cela peut conduire à des résultats surprenants ; voir la discussion dans la section partial matching pour plus de détails. |
QRegularExpression::NoMatch | 3 | Aucune correspondance n'est effectuée. Cette valeur est renvoyée comme type de correspondance par une construction par défaut QRegularExpressionMatch ou QRegularExpressionMatchIterator. L'utilisation de ce type de correspondance n'est pas très utile pour l'utilisateur, car il n'y a jamais de correspondance. Cette valeur enum a été introduite dans Qt 5.1. |
enum QRegularExpression::PatternOption
flags QRegularExpression::PatternOptions
L'enum PatternOption définit les modificateurs de la façon dont la chaîne de motifs doit être interprétée, et donc la façon dont le motif correspond à une chaîne de sujet.
| Constante | Valeur | Description |
|---|---|---|
QRegularExpression::NoPatternOption | 0x0000 | Aucune option de motif n'est définie. |
QRegularExpression::CaseInsensitiveOption | 0x0001 | Le motif doit être comparé à la chaîne de l'objet sans tenir compte de la casse. Cette option correspond au modificateur /i dans les expressions régulières Perl. |
QRegularExpression::DotMatchesEverythingOption | 0x0002 | Le métacaractère point (.) dans la chaîne du motif peut correspondre à n'importe quel caractère de la chaîne de l'objet, y compris les nouvelles lignes (normalement, le point ne correspond pas aux nouvelles lignes). Cette option correspond au modificateur /s dans les expressions régulières Perl. |
QRegularExpression::MultilineOption | 0x0004 | Les métacaractères caret (^) et dollar ($) de la chaîne de motifs sont autorisés à correspondre, respectivement, immédiatement après et immédiatement avant une nouvelle ligne dans la chaîne du sujet, ainsi qu'au tout début et à la toute fin de la chaîne du sujet. Cette option correspond au modificateur /m dans les expressions régulières Perl. |
QRegularExpression::ExtendedPatternSyntaxOption | 0x0008 | Tout espace blanc dans la chaîne de caractères qui n'est pas échappé et qui ne fait pas partie d'une classe de caractères est ignoré. De plus, un point non échappé(#) en dehors d'une classe de caractères entraîne l'ignorance de tous les caractères suivants, jusqu'à la première nouvelle ligne (incluse). Cette option peut être utilisée pour améliorer la lisibilité d'une chaîne de caractères ainsi que pour placer des commentaires à l'intérieur d'expressions régulières ; elle est particulièrement utile si la chaîne de caractères est chargée à partir d'un fichier ou écrite par l'utilisateur, car dans le code C++, il est toujours possible d'utiliser les règles relatives aux chaînes de caractères littérales pour placer des commentaires à l'extérieur de la chaîne de caractères. Cette option correspond au modificateur /x dans les expressions régulières Perl. |
QRegularExpression::InvertedGreedinessOption | 0x0010 | L'avidité des quantificateurs est inversée : *, +, ?, {m,n}, etc. deviennent paresseux, tandis que leurs versions paresseuses (*?, +?, ??, {m,n}?, etc.) deviennent gourmandes. Il n'y a pas d'équivalent pour cette option dans les expressions régulières en Perl. |
QRegularExpression::DontCaptureOption | 0x0020 | Les groupes de capture non nommés ne capturent pas les sous-chaînes ; les groupes de capture nommés fonctionnent toujours comme prévu, ainsi que le groupe de capture implicite numéro 0 correspondant à la correspondance entière. Il n'y a pas d'équivalent pour cette option dans les expressions régulières en Perl. |
QRegularExpression::UseUnicodePropertiesOption | 0x0040 | La signification des classes de caractères \w, \d, etc., ainsi que la signification de leurs équivalents (\W, \D, etc.), passe de la correspondance avec les caractères ASCII uniquement à la correspondance avec n'importe quel caractère ayant la propriété Unicode correspondante. Par exemple, \d correspond à tout caractère ayant la propriété Unicode Nd (chiffre décimal) ; \w correspond à tout caractère ayant la propriété Unicode L (lettre) ou N (chiffre), plus le trait de soulignement, et ainsi de suite. Cette option correspond au modificateur /u dans les expressions régulières Perl. |
Le type PatternOptions est un typedef pour QFlags<PatternOption>. Il stocke une combinaison OR de valeurs PatternOption.
[since 6.0] enum QRegularExpression::WildcardConversionOption
flags QRegularExpression::WildcardConversionOptions
L'enum WildcardConversionOption définit les modificateurs de la manière dont un motif global de caractères génériques est converti en un motif d'expression régulière.
| Constante | Valeur | Description |
|---|---|---|
QRegularExpression::DefaultWildcardConversion | 0x0 | Aucune option de conversion n'est définie. |
QRegularExpression::UnanchoredWildcardConversion | 0x1 | La conversion n'ancre pas le motif. Cela permet des correspondances partielles de chaînes de caractères avec des expressions génériques. |
QRegularExpression::NonPathWildcardConversion (since Qt 6.6) | 0x2 | La conversion n' interprétera pas le motif comme une globalisation de chemin de fichier. |
Cette liste a été introduite dans Qt 6.0.
Le type WildcardConversionOptions est un typedef pour QFlags<WildcardConversionOption>. Il stocke une combinaison OU de valeurs WildcardConversionOption.
Voir également QRegularExpression::wildcardToRegularExpression.
Documentation des fonctions membres
QRegularExpression::QRegularExpression()
Construit un objet QRegularExpression avec un motif vide et aucune option de motif.
Voir aussi setPattern() et setPatternOptions().
[explicit] QRegularExpression::QRegularExpression(const QString &pattern, QRegularExpression::PatternOptions options = NoPatternOption)
Construit un objet QRegularExpression en utilisant pattern comme motif et options comme options de motif.
Voir aussi setPattern() et setPatternOptions().
[noexcept] QRegularExpression::QRegularExpression(const QRegularExpression &re)
Construit un objet QRegularExpression comme une copie de re.
Voir aussi operator=().
[constexpr noexcept, since 6.1] QRegularExpression::QRegularExpression(QRegularExpression &&re)
Construit un objet QRegularExpression en le déplaçant de re.
Notez qu'une QRegularExpression déplacée à partir d'un objet ne peut être que détruite ou assignée. L'effet de l'appel à d'autres fonctions que le destructeur ou l'un des opérateurs d'affectation n'est pas défini.
Cette fonction a été introduite dans Qt 6.1.
Voir aussi operator=().
[noexcept] QRegularExpression::~QRegularExpression()
Détruit l'objet QRegularExpression.
[static] QString QRegularExpression::anchoredPattern(QStringView expression)
Renvoie l'adresse expression placée entre les ancres \A et \z à utiliser pour la correspondance exacte.
[static] QString QRegularExpression::anchoredPattern(const QString &expression)
Il s'agit d'une fonction surchargée.
int QRegularExpression::captureCount() const
Renvoie le nombre de groupes de capture contenus dans la chaîne de motifs, ou -1 si l'expression régulière n'est pas valide.
Note : Le groupe de capture implicite 0 n'est pas inclus dans le nombre retourné.
Voir aussi isValid().
QString QRegularExpression::errorString() const
Renvoie une description textuelle de l'erreur trouvée lors de la vérification de la validité de l'expression régulière, ou "no error" si aucune erreur n'a été trouvée.
Voir aussi isValid() et patternErrorOffset().
[static] QString QRegularExpression::escape(QStringView str)
Échappe tous les caractères de str afin qu'ils n'aient plus de signification particulière lorsqu'ils sont utilisés comme chaîne de motifs d'expressions régulières, et renvoie la chaîne échappée. Par exemple :
QString escaped = QRegularExpression::escape("a(x) = f(x) + g(x)"); // escaped == "a\\(x\\)\\ \\=\\ f\\(x\\)\\ \\+\\ g\\(x\\)"
Ceci est très pratique pour construire des motifs à partir de chaînes arbitraires :
QString pattern = "(" + QRegularExpression::escape(name) + "|" + QRegularExpression::escape(nickname) + ")"; QRegularExpression re(pattern);
Note : Cette fonction implémente l'algorithme quotemeta de Perl et échappe avec une barre oblique inverse tous les caractères de str, à l'exception des caractères des plages [A-Z], [a-z] et [0-9], ainsi que le caractère de soulignement (_). La seule différence avec Perl est qu'un NUL littéral à l'intérieur de str est échappé par la séquence "\\0" (barre oblique inverse + '0'), au lieu de "\\\0" (barre oblique inverse + NUL).
[static] QString QRegularExpression::escape(const QString &str)
Il s'agit d'une fonction surchargée.
[static, since 6.0] QRegularExpression QRegularExpression::fromWildcard(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseInsensitive, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
Renvoie une expression régulière du motif global pattern. L'expression régulière sera sensible à la casse si cs est Qt::CaseSensitive, et convertie selon options.
Équivalent à
auto reOptions = cs == Qt::CaseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption; return QRegularExpression(wildcardToRegularExpression(str, options), reOptions);
Cette fonction a été introduite dans Qt 6.0.
QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
Tente d'effectuer une correspondance globale de l'expression régulière avec la chaîne subject donnée, à partir de la position offset à l'intérieur du sujet, en utilisant une correspondance de type matchType et en respectant la chaîne matchOptions donnée.
La chaîne QRegularExpressionMatchIterator renvoyée est placée avant le premier résultat de la correspondance (s'il y en a un).
Voir aussi QRegularExpressionMatchIterator et global matching.
[since 6.5] QRegularExpressionMatchIterator QRegularExpression::globalMatchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
Tente d'effectuer une correspondance globale de l'expression régulière avec la vue de la chaîne subjectView donnée, en commençant à la position offset dans le sujet, en utilisant une correspondance de type matchType et en respectant la valeur matchOptions donnée.
L'adresse QRegularExpressionMatchIterator renvoyée est placée avant le premier résultat de la correspondance (s'il y en a un).
Remarque : les données référencées par subjectView doivent rester valides tant que des objets QRegularExpressionMatchIterator ou QRegularExpressionMatch les utilisent.
Cette fonction a été introduite dans Qt 6.5.
Voir également QRegularExpressionMatchIterator et global matching.
bool QRegularExpression::isValid() const
Retourne true si l'expression régulière est valide (c'est-à-dire qu'elle ne contient pas d'erreurs de syntaxe, etc.), ou false dans le cas contraire. Utilisez errorString() pour obtenir une description textuelle de l'erreur.
Voir aussi errorString() et patternErrorOffset().
QRegularExpressionMatch QRegularExpression::match(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
Tente de faire correspondre l'expression régulière à la chaîne subject donnée, à partir de la position offset à l'intérieur du sujet, en utilisant une correspondance de type matchType et en respectant l'expression matchOptions donnée.
L'objet QRegularExpressionMatch renvoyé contient les résultats de la correspondance.
Voir aussi QRegularExpressionMatch et normal matching.
[since 6.5] QRegularExpressionMatch QRegularExpression::matchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
Tente de faire correspondre l'expression régulière à la vue de la chaîne subjectView donnée, en commençant à la position offset dans le sujet, en utilisant une correspondance de type matchType et en respectant la valeur matchOptions donnée.
L'objet QRegularExpressionMatch renvoyé contient les résultats de la correspondance.
Remarque : les données référencées par subjectView doivent rester valides tant que des objets QRegularExpressionMatch les utilisent.
Cette fonction a été introduite dans Qt 6.5.
Voir aussi QRegularExpressionMatch et normal matching.
QStringList QRegularExpression::namedCaptureGroups() const
Renvoie une liste de captureCount() + 1 éléments, contenant les noms des groupes de capture nommés dans la chaîne de motifs. La liste est triée de telle sorte que l'élément de la liste à la position i est le nom du i-ème groupe de capture, s'il a un nom, ou une chaîne vide si ce groupe de capture n'est pas nommé.
Par exemple, avec l'expression régulière
(?<day>\d\d)-(?<month>\d\d)-(?<year>\d\d\d\d) (\w+) (?<name>\w+)
namedCaptureGroups() renverra la liste suivante :
("", "day", "month", "year", "", "name")
ce qui correspond au fait que le groupe de capture #0 (correspondant à l'ensemble de la correspondance) n'a pas de nom, le groupe de capture #1 a pour nom "day", le groupe de capture #2 a pour nom "month", etc.
Si l'expression régulière n'est pas valide, elle renvoie une liste vide.
Voir aussi isValid(), QRegularExpressionMatch::captured(), et QString::isEmpty().
void QRegularExpression::optimize() const
Compile le motif immédiatement, y compris la compilation JIT (si la JIT est activée) pour l'optimisation.
Voir aussi isValid() et Debugging Code that Uses QRegularExpression.
QString QRegularExpression::pattern() const
Renvoie la chaîne de caractères de l'expression régulière.
Voir aussi setPattern() et patternOptions().
qsizetype QRegularExpression::patternErrorOffset() const
Renvoie le décalage, à l'intérieur de la chaîne de motifs, auquel une erreur a été trouvée lors de la vérification de la validité de l'expression régulière. Si aucune erreur n'a été trouvée, -1 est renvoyé.
Voir aussi pattern(), isValid() et errorString().
QRegularExpression::PatternOptions QRegularExpression::patternOptions() const
Renvoie les options du motif pour l'expression régulière.
Voir aussi setPatternOptions() et pattern().
void QRegularExpression::setPattern(const QString &pattern)
Définit la chaîne de motifs de l'expression régulière à pattern. Les options de motifs restent inchangées.
Voir aussi pattern() et setPatternOptions().
void QRegularExpression::setPatternOptions(QRegularExpression::PatternOptions options)
Définit l'adresse options comme option de motif de l'expression régulière. La chaîne de caractères reste inchangée.
Voir aussi patternOptions() et setPattern().
[noexcept] void QRegularExpression::swap(QRegularExpression &other)
Remplace cette expression régulière par other. Cette opération est très rapide et n'échoue jamais.
[static] QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
Renvoie une représentation sous forme d'expression régulière du glob donné pattern.
Deux transformations sont possibles, l'une ciblant la globalisation des chemins d'accès et l'autre plus générique.
Par défaut, la transformation cible la globalisation des chemins de fichiers, ce qui signifie en particulier que les séparateurs de chemins reçoivent un traitement spécial. Cela implique qu'il ne s'agit pas d'une simple traduction de "*" en ".*" et similaires.
QString wildcard = QRegularExpression::wildcardToRegularExpression("*.jpeg"); // Will match files with names like: // foo.jpeg // f_o_o.jpeg // föö.jpeg
La transformation de globbing plus générique est disponible en passant NonPathWildcardConversion dans la conversion options.
Cette implémentation suit de près la définition des caractères génériques pour les motifs globaux :
| c | Tout caractère se 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, à l'exception d'un séparateur de chemin d'accès (dans le cas où la globalisation des chemins d'accès a été sélectionnée). C'est la même chose que b{.} dans les expressions rationnelles complètes. |
| * | Correspond à zéro ou plusieurs caractères quelconques, à l'exception des séparateurs de chemin (si la globalisation des chemins d'accès a été sélectionnée). C'est la même chose que .* dans les expressions rationnelles complètes. |
| [abc] | Correspond à un caractère donné entre crochets. |
| [a-c] | Correspond à un caractère de la plage indiquée entre crochets. |
| [!abc] | Recherche un caractère qui n'est pas indiqué dans la parenthèse. C'est la même chose que [^abc] dans une expression rationnelle complète. |
| [!a-c] | Recherche un caractère qui n'est pas compris dans l'intervalle indiqué entre crochets. C'est la même chose que [^a-c] dans une expression rationnelle complète. |
Remarque : pour des raisons historiques, la barre oblique inverse (\) n' est pas un caractère d'échappement dans ce contexte. Pour faire correspondre l'un des caractères spéciaux, placez-le entre crochets (par exemple, [?]).
De plus amples informations sur l'implémentation peuvent être trouvées dans :
- L'article Glob de Wikipedia
man 7 glob
Par défaut, l'expression régulière renvoyée est entièrement ancrée. En d'autres termes, il n'est pas nécessaire d'appeler à nouveau anchoredPattern() sur le résultat. Pour obtenir une expression régulière qui n'est pas ancrée, passez UnanchoredWildcardConversion dans la conversion options.
Voir aussi escape().
[static] QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
Il s'agit d'une fonction surchargée.
[noexcept] QRegularExpression &QRegularExpression::operator=(QRegularExpression &&re)
Move - assigne l'expression régulière re à cet objet et renvoie une référence au résultat. Le motif et les options du motif sont copiés.
Notez qu'un objet déplacé de QRegularExpression ne peut être détruit ou assigné qu'à cet objet. L'effet de l'appel à d'autres fonctions que le destructeur ou l'un des opérateurs d'affectation n'est pas défini.
[noexcept] QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re)
Affecte l'expression régulière re à cet objet et renvoie une référence à la copie. Le motif et les options du motif sont copiés.
Non-membres apparentés
[noexcept] size_t qHash(const QRegularExpression &key, size_t seed = 0)
Renvoie la valeur de hachage pour key, en utilisant seed comme base de calcul.
[noexcept] bool operator!=(const QRegularExpression &lhs, const QRegularExpression &rhs)
Renvoie true si l'expression régulière lhs est différente de rhs, ou false dans le cas contraire.
Voir aussi operator==().
QDataStream &operator<<(QDataStream &out, const QRegularExpression &re)
Écrit l'expression régulière re dans le flux out.
Voir aussi Serializing Qt Data Types (Sérialisation des types de données Qt).
QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions)
Écrit les options du modèle patternOptions dans l'objet de débogage debug à des fins de débogage.
Voir aussi Techniques de débogage.
QDebug operator<<(QDebug debug, const QRegularExpression &re)
Écrit l'expression régulière re dans l'objet de débogage debug à des fins de débogage.
Voir aussi Techniques de débogage.
[noexcept] bool operator==(const QRegularExpression &lhs, const QRegularExpression &rhs)
Renvoie true si l'expression régulière lhs est égale à rhs, ou false dans le cas contraire. Deux objets QRegularExpression sont égaux s'ils ont la même chaîne de motifs et les mêmes options de motifs.
Voir aussi operator!=().
QDataStream &operator>>(QDataStream &in, QRegularExpression &re)
Lit une expression régulière du flux in dans re.
Voir aussi Serializing Qt Data Types (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.