QRegExp Class
La classe QRegExp permet la recherche de motifs à l'aide d'expressions régulières. Plus d'informations...
| En-tête : | #include <QRegExp> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core5Compat)target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake : | QT += core5compat |
- Liste de tous les membres, y compris les membres hérités
- QRegExp fait partie des classes implicitement partagées.
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) |
Non-membres apparentés
| size_t | qHash(const QRegExp &key, size_t seed = 0) |
| QDataStream & | operator<<(QDataStream &out, const QRegExp ®Exp) |
| QDataStream & | operator>>(QDataStream &in, QRegExp ®Exp) |
Description détaillée
Cette classe est obsolète dans Qt 6. Veuillez utiliser QRegularExpression à la place pour tout nouveau code. Pour des directives sur le portage de l'ancien code de QRegExp vers QRegularExpression, voir {Portage vers QRegularExpression}.
Une expression régulière, ou "regexp", est un modèle permettant de faire correspondre des sous-chaînes dans un texte. Elle est utile dans de nombreux contextes, par exemple,
| Validation | Une expression rationnelle peut vérifier 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. |
Une brève introduction aux regexps est présentée, ainsi qu'une description du langage regexp de Qt, quelques exemples et la documentation de la fonction elle-même. QRegExp s'inspire du langage de regexp de Perl. Il supporte entièrement l'Unicode. QRegExp peut également être utilisé dans un mode plus simple, avec des caractères de remplacement, qui est similaire à la fonctionnalité trouvée dans les shells de commande. 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 à QRegExp::FixedString, ce qui signifie que le motif à rechercher 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 inverse) ne sont pas échappés.
Un bon texte sur les regexps est Mastering Regular Expressions (Third Edition) de Jeffrey E. F. Friedl, ISBN 0-596-52812-4.
Remarque : dans Qt 5, la nouvelle classe QRegularExpression fournit une implémentation compatible avec Perl des expressions régulières et est recommandée à la place de QRegExp.
Introduction
Les regexps sont construites à partir 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. Nous pouvons écrire cette même expression sous la forme [A-D], et une expression correspondant à n'importe quelle lettre majuscule de l'alphabet anglais s'écrit [A-Z].
Un quantificateur précise le nombre d'occurrences d'une expression qui doivent être prises en compte. x{1,1} signifie qu'il faut prendre en compte un et un seul x. x{1,5} signifie qu'il faut prendre en compte une séquence de x caractères contenant au moins un x mais pas plus de cinq.
Notez qu'en général, les expressions rationnelles ne peuvent pas être utilisées pour vérifier la présence de parenthèses équilibrées ou de balises. Par exemple, une expression rationnelle peut être écrite pour faire correspondre une ouverture html <b> et sa fermeture </b>, si les balises <b> ne sont pas imbriquées, mais si les balises <b> sont imbriquées, cette même expression rationnelle fera correspondre une ouverture <b> avec une fermeture erronée </b>. Pour le fragment <b>bold <b>bolder</b></b>, le premier <b> serait associé au premier </b>, ce qui n'est pas correct. Il est toutefois possible d'écrire une expression rationnelle qui fera correspondre correctement des parenthèses ou des balises imbriquées, mais uniquement si le nombre de niveaux d'imbrication est fixe et connu. Si le nombre de niveaux d'imbrication n'est pas fixe et connu, il est impossible d'écrire une expression rationnelle qui n'échouera pas.
Supposons que nous voulions une expression rationnelle qui corresponde à des nombres entiers compris entre 0 et 99. Il faut au moins un chiffre, nous commençons donc par l'expression [0-9]{1,1}, qui correspond à un seul chiffre exactement une fois. Cette expression permet de faire correspondre les nombres entiers compris entre 0 et 9. Pour faire correspondre les nombres entiers jusqu'à 99, augmentez le nombre maximal d'occurrences à 2, de sorte que la regexp devient [0-9]{1,2}. Cette regexp répond à l'exigence initiale de faire correspondre les nombres entiers de 0 à 99, mais elle correspond également aux nombres entiers qui se trouvent au milieu des chaînes de caractères. Si nous voulons que l'entier correspondant soit la chaîne entière, nous devons utiliser les assertions d'ancrage, ^ (caret) et $ (dollar). Lorsque ^ est le premier caractère d'une regexp, cela signifie que la regexp doit correspondre au début de la chaîne. Lorsque $ est le dernier caractère de la regexp, cela signifie que la regexp doit correspondre à la fin de la chaîne. La regexp devient alors ^[0-9]{1,2}$. Notez que les assertions, par exemple ^ et $, ne correspondent pas à des caractères mais à des emplacements dans la chaîne.
Si vous avez vu des expressions rationnelles décrites ailleurs, il se peut qu'elles soient différentes de celles présentées ici. En effet, certains jeux de caractères et certains quantificateurs sont si courants qu'ils ont été représentés par des symboles spéciaux. [0-9] peut être remplacé par le symbole \d. Le quantificateur correspondant à une seule occurrence, {1,1}, peut être remplacé par l'expression elle-même, c'est-à-dire que x{1,1} est identique à x. Ainsi, notre outil de recherche de 0 à 99 pourrait s'écrire ^\d{1 ,2}$. Il peut également s'écrire ^\d\d {0 ,1}$, c'est-à-dire qu'à partir du début de la chaîne, il faut faire correspondre un chiffre, suivi immédiatement de 0 ou 1 chiffre. En pratique, elle s'écrit ^\d\d ?$. Le ? est une abréviation du quantificateur {0,1}, c'est-à-dire 0 ou 1 occurrence. ? rend une expression facultative. La regexp ^\d\d ?$ signifie Au début de la chaîne, faire correspondre un chiffre, suivi immédiatement de 0 ou 1 chiffre supplémentaire, suivi immédiatement de la fin de la chaîne.
Pour écrire une expression rationnelle qui correspond à l'un des mots "mail" , "letter" ou "correspondence", mais qui ne correspond pas aux mots qui contiennent ces mots, par exemple "email", "mailman", "mailer" et "letterbox", commencez par une expression rationnelle qui correspond à "mail". Exprimée complètement, la regexp 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 la regexp en mail, c'est-à-dire un "m" suivi d'un "a" suivi d'un "i" suivi d'un "l". Nous pouvons maintenant utiliser la barre verticale |, qui signifie ou, pour inclure les deux autres mots, de sorte que notre expression rationnelle correspondant à l'un des trois mots devient courrier|lettre|correspondance. Elle correspond à "courrier" , "lettre" ou "correspondance". Bien que cette expression rationnelle corresponde à l'un des trois mots que nous voulons faire correspondre, elle correspondra également à des mots que nous ne voulons pas faire correspondre, par exemple, "email". Afin d'éviter que l'expression rationnelle ne corresponde à des mots non désirés, nous devons lui demander de commencer et de terminer la correspondance à la limite des mots. Tout d'abord, nous plaçons notre expression rationnelle entre parenthèses (mail|lettre|correspondance). Les parenthèses regroupent les expressions et identifient une partie de l'expression recherchée que nous souhaitons capture. Le fait de mettre l'expression entre parenthèses nous permet de l'utiliser en tant que composant dans des expressions recherchées plus complexes. Cela nous permet également d'examiner lequel des trois mots a réellement été trouvé. Pour forcer la correspondance à commencer et à se terminer sur les frontières des mots, nous entourons la regexp de \b assertions de limites de mots: \b(mail|letter|correspondance)\b. La regexp signifie maintenant : Correspondre à une limite de mot, suivie de l'expression rationnelle entre parenthèses, suivie d'une limite de mot. L'assertion \b correspond à une position dans l'expression rationnelle, et non à un caractère. Une limite de mot est un caractère autre qu'un mot, par exemple un espace, une nouvelle ligne ou le début ou la fin d'une chaîne de caractères.
Si nous voulons remplacer les caractères esperluette par l'entité HTML & ;, l'expression rationnelle à utiliser est simplement &. Mais cette expression rationnelle correspondra également aux esperluettes qui ont déjà été converties en entités HTML. Nous voulons remplacer uniquement les esperluettes qui ne sont pas déjà suivies par amp ;. Pour cela, nous avons besoin de l'assertion négative (?!__). La regexp peut alors être écrite sous la forme &(?!amp ;), c'est-à-dire qu'elle correspond à une esperluette qui n' est pas suivie d'une amp ;.
Si nous voulons compter toutes les occurrences de 'Eric' et 'Eirik' dans une chaîne de caractères, deux solutions valables 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 qui contiennent l'un ou l'autre nom, par exemple 'Ericsson'. Notez que la deuxième expression rationnelle correspond à plus d'orthographes que nous ne le souhaitons : "Eric", "Erik", "Eiric" et "Eirik".
Certains des exemples présentés ci-dessus sont mis en œuvre dans la section code examples.
Caractères et abréviations pour les ensembles de caractères
| Élément | Signification |
|---|---|
| c | Un caractère se représente lui-même, à moins qu'il n'ait une signification particulière dans le cadre d'une expression rationnelle (regexp). Par exemple, c correspond au caractère c. |
| \c | Un caractère qui suit une barre oblique inverse correspond au caractère lui-même, sauf dans les cas spécifiés ci-dessous. Par exemple, pour faire correspondre un caret littéral au début d'une chaîne de caractères, écrivez \^. |
| \a | Correspond à la cloche ASCII (BEL, 0x07). |
| \f | Correspond au saut de page ASCII (FF, 0x0C). |
| \n | Correspond au saut de ligne ASCII (LF, 0x0A, nouvelle ligne Unix). |
| \r | Correspond au retour chariot ASCII (CR, 0x0D). |
| \t | Correspond à la tabulation horizontale ASCII (HT, 0x09). |
| \v | Correspond à la tabulation verticale ASCII (VT, 0x0B). |
| \xhhhh | Correspond au caractère Unicode correspondant au nombre hexadécimal hhhh (entre 0x0000 et 0xFFFF). |
| \0ooo (i.e., \zero ooo) | Correspond au caractère ASCII/Latin1 correspondant au nombre octal ooo (entre 0 et 0377). |
| . (point) | Correspond à n'importe quel caractère (y compris la nouvelle ligne). |
| \d | Correspond à un chiffre (QChar::isDigit()). |
| \D | Correspond à un caractère autre qu'un chiffre. |
| \s | Correspond à un caractère d'espacement (QChar::isSpace()). |
| \S | Correspond à un caractère autre qu'un espace blanc. |
| \w | Correspond à un mot (QChar::isLetterOrNumber(), QChar::isMark(), ou '_'). |
| \W | Correspond à un caractère non verbal. |
| \n | La n-ième référence arrière, par exemple \1, \2, etc. |
Remarque : le compilateur C++ transforme les barres obliques inverses en chaînes de caractères. Pour inclure une barre oblique inverse dans une expression rationnelle, saisissez-la deux fois, c'est-à-dire \\. Pour faire correspondre le caractère barre oblique inverse lui-même, saisissez-le quatre fois, c'est-à-dire \\\\.
Jeux de caractères
Les crochets signifient qu'il y a correspondance avec n'importe quel caractère contenu dans les crochets. Les abréviations des jeux de caractères décrites ci-dessus peuvent apparaître dans un jeu de caractères entre crochets. À l'exception des abréviations du jeu de caractères et des deux exceptions suivantes, les caractères n'ont pas de signification particulière entre crochets.
| ^ | Le caret annule le jeu de caractères s'il apparaît comme premier caractère (c'est-à-dire immédiatement après le crochet ouvrant). [abc] correspond à "a", "b" ou "c", mais [^abc] correspond à tout ce qui n'est pas "a", "b" ou "c". |
| - | Le tiret indique une plage de caractères. [ W-Z] correspond à 'W' ou 'X' ou 'Y' ou 'Z'. |
L'utilisation des abréviations du jeu de caractères prédéfini est plus facile à utiliser que l'utilisation de plages de caractères sur les différentes plates-formes et dans les différentes langues. Par exemple, [0-9] correspond à un chiffre dans les alphabets occidentaux mais \d correspond à un chiffre dans n'importe quel alphabet.
Remarque : dans d'autres documentations sur les expressions rationnelles, les jeux de caractères sont souvent appelés "classes de caractères".
Les 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 signifie expression. Une expression est un caractère, ou une abréviation pour un ensemble de caractères, ou 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 elle correspondra à l'expression, qu'elle soit trouvée ou non. E? est identique à E{0,1}. Par exemple, dents ? correspond à "dent" ou "dents". |
| E+ | Correspond à une ou plusieurs occurrences de E. E+ est identique à E{1,}. Par exemple, 0+ correspond à "0", "00", "000", etc. |
| E* | Correspond à zéro ou plusieurs occurrences de E. Il est identique à E{0,}. Le quantificateur * est souvent utilisé par erreur là où il faudrait utiliser +. Par exemple, si \s*$ est utilisé dans une expression pour faire correspondre des chaînes qui se terminent par un espace, il correspondra à toutes les chaînes, car \s*$ signifie " correspondre à zéro ou plusieurs espaces suivis de la fin de la chaîne". La regexp correcte pour faire correspondre les chaînes qui ont au moins un caractère d'espacement à la fin est \s+$. |
| E{n} | Correspond à exactement n occurrences de E. E{n} revient à répéter E n fois. Par exemple, x{5} correspond à xxxxx. C'est également la même chose que E{n,n}, par exemple x{5,5}. |
| E{n,} | Correspond à au moins n occurrences de E. |
| E{,m} | Correspond à au plus m occurrences de E. E{,m} est identique à 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 pour regrouper les caractères dans une expression. Par exemple, tag+ correspond à un "t" suivi d'un "a" suivi d'au moins un "g", tandis que (tag)+ correspond à au moins une occurrence de "tag".
Remarque : les quantificateurs sont normalement "gourmands". Ils correspondent toujours à la plus grande partie possible du texte. Par exemple, 0+ correspond au premier zéro qu'il trouve et à tous les zéros consécutifs après le premier zéro. Appliqué à "20005", il correspond à "20005". Les quantificateurs peuvent être rendus non gourmands, voir setMinimal().
Capture du texte
Les parenthèses nous permettent de regrouper des éléments afin de les quantifier et de les capturer. Par exemple, si l'expression mail|lettre|correspondance correspond à une chaîne de caractères, nous savons que l 'un des mots correspond, mais pas lequel. L'utilisation de parenthèses nous permet de "capturer" tout ce qui correspond à l'intérieur de leurs limites. Ainsi, si nous avons utilisé (mail|lettre|correspondance) et que nous avons comparé cette expression rationnelle à la chaîne "Je vous ai envoyé un e-mail", nous pouvons utiliser les fonctions cap() ou capturedTexts() pour extraire les caractères correspondants, dans ce cas "mail".
Nous pouvons utiliser le texte capturé à l'intérieur de l'expression rationnelle elle-même. Pour faire référence au texte capturé, nous utilisons les références arrière qui sont indexées à partir de 1, de la même manière que pour cap(). Par exemple, nous pouvons rechercher des mots en double dans une chaîne en utilisant \b( \w+ )\W + \1\b , ce qui signifie correspondre à une limite de mot suivie d'un ou plusieurs caractères de mot suivis d'un ou plusieurs caractères de non-mot suivis du même texte que la première expression entre parenthèses suivie d'une limite de mot.
Si nous voulons utiliser les parenthèses uniquement pour le regroupement et non pour la capture, nous pouvons utiliser la syntaxe non capturante, par exemple (?:vert|bleu). Les parenthèses non capturantes commencent par "(? :" et se terminent par ")". Dans cet exemple, la correspondance est soit "verte", soit "bleue", mais nous ne capturons pas la correspondance, de sorte que nous savons seulement si nous avons trouvé la correspondance, mais pas quelle couleur nous avons effectivement trouvée. L'utilisation de parenthèses non capturantes est plus efficace que l'utilisation de parenthèses capturantes, car le moteur d'expressions rationnelles doit faire moins de comptabilité.
Les parenthèses capturantes et non capturantes peuvent ê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" si cap(1) == "aaa". Ce comportement est différent de celui d'autres moteurs d'expressions rationnelles (notamment Perl). Pour obtenir un comportement de capture plus intuitif, spécifiez QRegExp::RegExp2 au constructeur de QRegExp ou appelez setPatternSyntax(QRegExp::RegExp2).
Lorsque le nombre de correspondances ne peut être déterminé à l'avance, il est courant d'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"]
Assertions
Les assertions font une déclaration sur le texte à l'endroit où elles apparaissent dans l'expression rationnelle, mais elles ne correspondent à aucun caractère. Dans la liste suivante, E représente n'importe quelle expression.
| ^ | Le caret indique le début de la chaîne de caractères. Si vous souhaitez faire correspondre un caractère littéral ^, vous devez l'échapper en écrivant \\^. Par exemple, ^#include ne correspondra qu'aux chaînes commençant par les caractères "#include". (Lorsque le caret est le premier caractère d'un jeu de caractères, il a une signification particulière, voir Sets of Characters). |
| $ | Le dollar indique la fin de la chaîne. Par exemple, \d\s *$ correspondra aux chaînes qui se terminent par un chiffre éventuellement suivi d'un espace. Si vous souhaitez faire correspondre une chaîne littérale à $, vous devez l'échapper en écrivant \\$. |
| \b | Une limite de mot. Par exemple, la regexp \bOK\b signifie que la lettre "O" doit être recherchée immédiatement après une limite de mot (par exemple, début de chaîne ou espace blanc), puis la lettre "K" immédiatement avant une autre limite de mot (par exemple, fin de chaîne ou espace blanc). Mais notez que l'assertion ne correspond à aucun espace blanc, donc si nous écrivons (\bOK\b ) et que nous avons une correspondance, elle ne contiendra que "OK" même si la chaîne est "C'est bon maintenant". |
| \B | Une limite de non-mot. Cette affirmation est vraie partout où \b est faux. Par exemple, si nous recherchons \Bon\B dans "Left on", la correspondance échouerait (l'espace et la fin de la chaîne ne sont pas des limites de non-mot), mais elle correspondrait à "tonne". |
| (?=E) | Prévision positive. Cette affirmation est vraie si l'expression correspond à ce point de la regexp. Par exemple, const(?=\s +char ) correspond à "const" lorsqu'il est suivi de "char", comme dans "static const char *". (Comparez avec const\s+char, qui correspond à "static const char *"). |
| (?!E) | Prévision négative. Cette affirmation est vraie si l'expression ne correspond pas à ce point de la regexp. Par exemple, const( ?!\s +char ) correspond à "const" sauf s 'il est suivi de "char". |
Correspondance de caractères génériques
La plupart des interpréteurs de commandes 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 regexp et le mode wildcard. La correspondance avec les caractères génériques est beaucoup plus simple que les expressions rationnelles complètes et ne comporte que quatre caractéristiques :
| 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 unique. C'est la même chose que . dans les expressions rationnelles complètes. |
| * | Correspond à zéro ou plusieurs caractères quelconques. C'est la même chose que .* dans les expressions rationnelles complètes. |
| [...] | Les ensembles de caractères peuvent être représentés entre crochets, comme dans les expressions rationnelles complètes. À l'intérieur de la classe de caractères, comme à l'extérieur, l'antislash n'a pas de signification particulière. |
Dans le mode Wildcard, les caractères génériques ne peuvent pas être échappés. Dans le mode WildcardUnix, le caractère "\" échappe au caractère générique.
Par exemple, si nous sommes en mode joker et que les chaînes de caractères contiennent des noms de fichiers, nous pouvons identifier les fichiers HTML avec *.html. Cela correspondra à zéro ou plusieurs caractères suivis d'un point et de 'h', 't', 'm' et 'l'.
Pour tester une chaîne de caractères à l'aide d'une expression générique, utilisez exactMatch(). Par exemple :
QRegExp rx("*.txt"); rx.setPatternSyntax(QRegExp::Wildcard); rx.exactMatch("README.txt"); // returns true rx.exactMatch("welcome.txt.bak"); // returns false
Notes pour les utilisateurs de Perl
La plupart des abréviations de classes de caractères supportées par Perl sont supportées par QRegExp, voir characters and abbreviations for sets of characters.
Dans QRegExp, à part à l'intérieur des classes de caractères, ^ signifie toujours le début de la chaîne, donc les carets doivent toujours être échappés à moins qu'ils ne soient utilisés dans ce but. En Perl, la signification du caret varie automatiquement en fonction de l'endroit où il apparaît, de sorte qu'il est rarement nécessaire de l'échapper. Il en va de même pour $ qui, dans QRegExp, signifie toujours la fin de la chaîne.
Les quantificateurs de QRegExp sont les mêmes que les quantificateurs gourmands de Perl (mais voir note above). La correspondance non gourmande ne peut pas être appliquée à des quantificateurs individuels, mais peut être appliquée à tous les quantificateurs du motif. Par exemple, pour faire correspondre la regexp Perl ro+?m, il faut :
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 en utilisant une option loop.
Dans QRegExp , . correspond à n'importe quel caractère, donc toutes les expressions rationnelles de QRegExp ont l'équivalent de l'option /s de Perl. QRegExp n'a 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 bouclant avec une regexp qui recherche les nouvelles lignes.
Comme QRegExp est orienté vers les chaînes de caractères, il n'y a pas d'assertions \A, \Z, ou \z. L'assertion \G n'est pas supportée mais peut être émulée dans une boucle.
Le $& de Perl est cap(0) ou capturedTexts()[0]. Il n'y a pas d'équivalent 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 /x de Perl n'est pas supportée, pas plus que les directives, par exemple (?i), ou les commentaires de regexp, par exemple (?#comment). En revanche, les règles de C++ pour les 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 lookahead positives et négatives de largeur nulle (?=pattern) et (?!pattern) sont supportées avec la même syntaxe que Perl. Les assertions d'anticipation de Perl, les sous-expressions "indépendantes" et les expressions conditionnelles ne sont pas supportées.
Les parenthèses non capturantes sont également supportées, avec la même syntaxe (?:pattern).
Voir QString::split() et QStringList::join() pour les équivalents des fonctions split et join de Perl.
Remarque : comme le C++ transforme les \Ns, ils doivent être écrits deux fois dans le code, par exemple \b doit être écrit \N\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 simple expression rationnelle de validation pour les 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 faire correspondre les chaînes qui ne contiennent pas d'espace.
Dans l'exemple suivant, nous faisons correspondre les chaînes contenant "mail", "letter" ou "correspondence", mais uniquement les 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 à "Veuillez écrire la lettre". Le mot "lettre" est également capturé (en raison des parenthèses). Nous pouvons voir le texte que nous avons capturé comme suit :
QString captured = rx.cap(1); // captured == "letter"
Ceci capturera le texte de la première série de parenthèses capturantes (en comptant les parenthèses capturantes de gauche à droite). Les parenthèses sont comptées à partir de 1 puisque cap(0) est l'expression recherchée complète (équivalente à '&' dans la plupart des moteurs d'expressions recherchées).
QRegExp rx("&(?!amp;)"); // match ampersands but not & QString line1 = "This & that"; line1.replace(rx, "&"); // line1 == "This & that" QString line2 = "His & hers & theirs"; line2.replace(rx, "&"); // line2 == "His & hers & theirs"
Ici, nous avons passé la QRegExp à la fonction replace() de QString pour 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 faire correspondre de manière répétée la regexp à la chaîne de caractères. Notez qu'au lieu d'avancer d'un caractère à la fois pos++, nous aurions pu écrire pos += rx.matchedLength() pour sauter la chaîne déjà trouvée. Le compte sera égal à 3, ce qui correspond à "Un Eric, un autre Eirik et un Ericsson. Combien d'Eiriks, Eric?"; il ne correspond pas à "Ericsson" ou "Eiriks" parce qu'ils ne sont pas délimités par des frontières de non-mots.
Une utilisation courante des expressions rationnelles consiste à diviser 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 ont le format suivant : nom de l'entreprise, adresse web et pays. Malheureusement, la regexp est assez longue et peu polyvalente - le code s'interrompra si nous ajoutons d'autres champs. Une solution plus simple et plus efficace consiste à rechercher le séparateur, '\t' dans ce cas, et à prendre le texte environnant. La fonction QString::split() peut prendre une chaîne de séparation ou une expression rationnelle comme argument et diviser une chaîne en conséquence.
QStringList field = str.split("\t");
Ici, le champ [0] correspond à la société, le champ [1] à l'adresse web, etc.
Pour imiter la correspondance d'un shell, nous pouvons utiliser le mode "wildcard".
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 par caractères génériques peut être pratique en raison de sa simplicité, mais toute expression rationnelle de caractères génériques peut être définie à l'aide d'expressions rationnelles complètes, par exemple .*\.html$. Remarquez que nous ne pouvons pas faire correspondre les fichiers .html et .htm avec un joker, à moins d'utiliser *.htm* qui correspondra également à 'test.html.bak'. Une expression rationnelle complète nous donne la précision dont nous avons besoin, .*\.html?$.
QRegExp peut faire une correspondance insensible à la casse en utilisant setCaseSensitivity(), et peut utiliser une correspondance non gourmande, voir setMinimal(). Par défaut, QRegExp utilise des expressions rationnelles complètes, mais cela peut être modifié avec setPatternSyntax(). La recherche peut se faire vers l'avant avec indexIn() ou vers l'arrière avec lastIndexIn(). Le texte capturé peut être consulté en utilisant capturedTexts() qui renvoie une liste de chaînes de caractères de toutes les chaînes capturées, ou en utilisant cap() qui renvoie la chaîne capturée pour l'index donné. La fonction pos() prend un index de correspondance et renvoie la position dans la chaîne où la correspondance a été faite (ou -1 s'il n'y a pas eu de correspondance).
Portage vers QRegularExpression
La classe QRegularExpression introduite dans Qt 5 Compatibility APIs implémente des expressions régulières compatibles avec Perl et représente une grande amélioration par rapport à QRegExp en termes d'API offertes, de syntaxe de motif prise en charge et de vitesse d'exécution. La plus grande différence est que QRegularExpression contient simplement une expression régulière et qu'elle n'est pas modifiée lorsqu'une correspondance est demandée. Au lieu de cela, un objet QRegularExpressionMatch est renvoyé pour vérifier le résultat d'une correspondance et extraire la sous-chaîne capturée. Il en va de même pour les correspondances globales et QRegularExpressionMatchIterator.
D'autres différences sont décrites ci-dessous.
Remarque : 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.
Syntaxe différente des motifs
Le portage d'une expression régulière de QRegExp à QRegularExpression peut nécessiter des modifications du motif lui-même.
Dans certains cas, QRegExp était trop indulgent et acceptait des motifs qui sont tout simplement invalides lorsqu'on utilise QRegularExpression. Il est facile de les détecter, car les objets QRegularExpression construits avec ces motifs ne sont pas valides (voir QRegularExpression::isValid()).
Dans d'autres cas, un motif porté de QRegExp à QRegularExpression peut changer silencieusement de sémantique. Il est donc nécessaire de revoir les motifs utilisés. Les cas les plus notables d'incompatibilité silencieuse sont les suivants :
- Les accolades sont nécessaires pour utiliser un échappement hexadécimal comme
\xHHHHavec plus de 2 chiffres. Un motif comme\x2022doit être porté à\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és. - Une quantification de 0 à n comme
{,n}doit être portée à{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}". - QRegExp effectue par défaut une correspondance compatible avec Unicode, tandis que QRegularExpression nécessite une option distincte ; voir ci-dessous pour plus de détails.
- c{.} dans QRegExp correspond par défaut à tous les caractères, y compris le caractère de retour à la ligne. QRegularExpression exclut le caractère de retour à la ligne par défaut. Pour inclure le caractère de retour à la ligne, définissez l'option QRegularExpression::DotMatchesEverythingOption.
Pour une vue d'ensemble de la syntaxe des expressions régulières prises en charge par QRegularExpression, veuillez consulter 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).
Portage de QRegExp::exactMatch()
QRegExp::exactMatchLa fonction QRegExp::exactMatch() avait deux objectifs : elle permettait de faire correspondre exactement une expression rationnelle à une chaîne de caractères, et elle implémentait une correspondance partielle.
Portage de la correspondance exacte de QRegExp
La correspondance exacte indique si l'expression rationnelle correspond à l'intégralité de la chaîne sujet. Par exemple, les classes produisent sur la chaîne sujet "abc123":
| QRegExp::exactMatch() | QRegularExpressionMatch::hasMatch() | |
|---|---|---|
"\\d+" | faux | vrai |
"[a-z]+\\d+" | vrai | vrai |
La correspondance exacte n'est pas reflétée dans QRegularExpression. Si vous voulez être sûr que la chaîne de l'objet correspond exactement à l'expression régulière, vous pouvez envelopper 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 de la correspondance partielle de QRegExp
Lors de l'utilisation de QRegExp::exactMatch(), si une correspondance exacte n'a pas été trouvée, il est toujours possible de connaître la longueur de la chaîne du sujet correspondant à l'expression rationnelle en appelant QRegExp::matchedLength(). Si la longueur renvoyée est égale à la longueur de la chaîne de l'objet, on peut en conclure qu'une correspondance partielle a été trouvée.
QRegularExpression prend en charge la correspondance partielle de manière explicite au moyen de l'adresse QRegularExpression::MatchType.
Correspondance globale
En raison des limitations de l'API QRegExp, il était impossible d'implémenter correctement la correspondance globale (c'est-à-dire comme le fait Perl). En particulier, les motifs qui peuvent correspondre à 0 caractère (comme "a*") sont problématiques.
QRegularExpression::globalMatch() implémente correctement la correspondance globale de Perl, et l'itérateur retourné peut être utilisé pour examiner chaque résultat.
Par exemple, si vous avez un code comme :
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 comme suit :
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
Lors de l'utilisation de QRegExp, les classes de caractères telles que \w, \d, etc. correspondent aux caractères ayant la propriété Unicode correspondante : par exemple, \d correspond à tout caractère ayant la propriété Unicode Nd (chiffre décimal).
Ces classes de caractères ne correspondent par défaut qu'aux caractères ASCII lors de l'utilisation de 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 les caractères génériques
Il n'y a pas de moyen direct de faire des correspondances avec des caractères génériques dans QRegularExpression. Cependant, la méthode QRegularExpression::wildcardToRegularExpression() est fournie pour traduire les motifs globaux en une expression rationnelle compatible avec Perl qui peut être utilisée à cette fin.
Par exemple, si vous avez un code comme :
Vous pouvez le réécrire comme suit :
auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));
Notez cependant que certains motifs de caractères génériques de type shell peuvent ne pas être traduits comme vous l'attendez. L'exemple de code suivant se cassera silencieusement s'il est simplement converti en utilisant 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
C'est parce que, par défaut, l'expression régulière retournée par QRegularExpression::wildcardToRegularExpression() est complètement ancrée. Pour obtenir une expression régulière qui n'est pas ancrée, passez 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émente la correspondance minimale en inversant simplement l'avidité des quantificateurs (QRegExp ne supporte pas les quantificateurs paresseux, comme *?, +?, etc.). QRegularExpression supporte au contraire les quantificateurs avides, paresseux et possessifs. L'option QRegularExpression::InvertedGreedinessOption peut être utile pour émuler les effets de QRegExp::setMinimal() : si elle est activée, elle inverse l'avidité des quantificateurs (les quantificateurs avides deviennent paresseux et vice versa).
Modes de caret
L'option QRegularExpression::AnchorAtOffsetMatchOption match peut être utilisée pour émuler le comportement de QRegExp::CaretAtOffset. Il n'y a pas d'équivalent pour les autres modes de QRegExp::CaretMode.
Voir aussi QString, QStringList, et QSortFilterProxyModel.
Documentation sur les types de membres
enum QRegExp::CaretMode
L'énumération CaretMode définit les différentes significations du caret(^) dans une expression régulière. Les valeurs possibles sont les suivantes :
| Constante | Valeur | Description |
|---|---|---|
QRegExp::CaretAtZero | 0 | Le caret correspond à l'index 0 de la chaîne recherchée. |
QRegExp::CaretAtOffset | 1 | Le caret correspond à l'offset de début de la recherche. |
QRegExp::CaretWontMatch | 2 | Le caret ne correspond jamais. |
enum QRegExp::PatternSyntax
La syntaxe utilisée pour interpréter la signification du motif.
| Constante | Valeur | Description |
|---|---|---|
QRegExp::RegExp | 0 | Une syntaxe de filtrage riche de type Perl. C'est la valeur par défaut. |
QRegExp::RegExp2 | 3 | Comme RegExp, mais avec greedy quantifiers. (Introduit dans Qt 4.2.) |
QRegExp::Wildcard | 1 | Ceci fournit une syntaxe simple de recherche de motifs similaire à celle utilisée par les shells (interpréteurs de commandes) pour le "globbing de fichiers". Voir QRegExp wildcard matching. |
QRegExp::WildcardUnix | 4 | Il s'agit d'une syntaxe similaire à celle de 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::FixedString | 2 | Le motif est une chaîne fixe. Cela équivaut à utiliser le motif RegExp sur une chaîne dans laquelle tous les métacaractères sont échappés à l'aide de escape(). |
QRegExp::W3CXmlSchema11 | 5 | Le motif est une expression régulière telle que définie par la spécification W3C XML Schema 1.1. |
Voir également setPatternSyntax().
Documentation des fonctions membres
QRegExp::QRegExp()
Construit une regexp vide.
Voir aussi isValid() et errorString().
[explicit] QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
Construit un objet d'expression régulière pour la chaîne pattern donnée. Le motif doit être donné en utilisant la notation joker si syntax est Wildcard; la valeur par défaut est RegExp. Le motif est sensible à la casse, sauf si cs est Qt::CaseInsensitive. La recherche est gourmande (maximale), mais peut être modifiée en appelant setMinimal().
Voir aussi setPattern(), setCaseSensitivity(), et setPatternSyntax().
QRegExp::QRegExp(const QRegExp &rx)
Construit une expression régulière comme une copie de rx.
Voir aussi operator=().
[noexcept] QRegExp::~QRegExp()
Détruit 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. L'ensemble de la correspondance a l'indice 0 et les sous-expressions parenthésées 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 correspondant à cap() est le suivant. Le premier élément, cap(0), est la totalité de la chaîne de caractères correspondante. Chaque élément suivant correspond à la parenthèse gauche ouverte capturante suivante. Ainsi, cap(1) est le texte de la première parenthèse capturante, cap(2) est le texte 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 est la chaîne complète qui a été trouvée. Chaque élément suivant de la liste contient une chaîne correspondant à une sous-expression (capturante) de l'expression rationnelle.
Par exemple, l'exemple ci-dessus capture également des éléments qui correspondent à des sous-expressions de la regexp :
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 non capturantes :
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 voulez itérer sur la liste, vous devez itérer sur une copie, par exemple.
QStringList list = rx.capturedTexts(); QStringList::iterator it = list.begin(); while (it != list.end()) { myProcessing(*it); ++it; }
Certaines expressions rationnelles peuvent 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 la regexp, rx, est (\d+ )+, nous espérons obtenir une liste de tous les nombres correspondants. Cependant, après avoir appelé rx.indexIn(str), capturedTexts() renverra la liste ("12", "12"), c'est-à-dire que la correspondance complète était "12" et que la première sous-expression trouvée était "12". L'approche correcte consiste à utiliser cap() dans un loop.
L'ordre des éléments de la liste de chaînes est le suivant. Le premier élément correspond à l'intégralité de la chaîne de caractères correspondante. Chaque élément suivant correspond à la capture suivante, ouverte entre parenthèses à gauche. Ainsi, capturedTexts()[1] est le texte de la première parenthèse capturante, capturedTexts()[2] est le texte de la deuxième et ainsi de suite (correspondant à $1, $2, etc., dans d'autres langages de regexp).
Voir également cap() et pos().
Qt::CaseSensitivity QRegExp::caseSensitivity() const
Renvoie Qt::CaseSensitive si l'expression rationnelle est respectueuse de la casse ; sinon, renvoie Qt::CaseInsensitive.
Voir aussi setCaseSensitivity(), patternSyntax(), pattern(), et isMinimal().
int QRegExp::countIn(const QString &str) const
Renvoie le nombre de fois où cette expression régulière correspond dans str.
Voir aussi indexIn(), lastIndexIn(), et replaceIn().
QString QRegExp::errorString() const
Renvoie une chaîne de texte expliquant pourquoi un motif regexp n'est pas valide dans le cas présent ; sinon, renvoie "aucune erreur n'est survenue".
Voir aussi isValid().
[static] QString QRegExp::escape(const QString &str)
Renvoie la chaîne de caractères str avec tous les caractères spéciaux de la regexp échappés par une barre oblique inverse. Les caractères spéciaux sont $, (,), *, +, ., ?, [, ,], ^, {, | et }.
Exemple :
Cette fonction est utile pour construire dynamiquement des motifs regexp :
Voir aussi setPatternSyntax().
bool QRegExp::exactMatch(const QString &str) const
Renvoie true si str correspond exactement à cette expression régulière ; sinon, renvoie false. Vous pouvez déterminer la partie de la chaîne qui a été reconnue en appelant matchedLength().
Pour une expression rationnelle R donnée, exactMatch("R") est l'équivalent de indexIn("^R$") puisque exactMatch() enferme effectivement l'expression rationnelle dans les ancres de début de chaîne et de fin de chaîne, sauf qu'il définit matchedLength() différemment.
Par exemple, si l'expression régulière est bleu, exactMatch() renvoie true uniquement pour l'entrée blue. Pour les entrées bluebell, blutak et lightblue, exactMatch() renvoie false et matchedLength() renvoie respectivement 4, 3 et 0.
Bien que constante, 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 la position d'index de la première correspondance exacte de cette expression rationnelle dans list, en effectuant une recherche à partir de la position d'index from. Renvoie -1 si aucun élément ne correspond.
Voir aussi 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 -1, la recherche commence au dernier caractère ; si -2, à l'avant-dernier caractère ; etc.
Renvoie la position de la première correspondance, ou -1 s'il n'y a pas de correspondance.
Le paramètre caretMode peut être utilisé pour indiquer si ^ doit rechercher à l'index 0 ou à offset.
Vous préférerez peut-être utiliser QString::indexOf(), QString::contains(), ou même QStringList::filter(). Pour remplacer les correspondances, 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 que constante, cette fonction définit matchedLength(), capturedTexts() et pos().
Si QRegExp est une expression générique (voir setPatternSyntax()) et que vous souhaitez tester une chaîne par rapport à l'ensemble de l'expression générique, utilisez exactMatch() au lieu de cette fonction.
Voir également lastIndexIn() et exactMatch().
bool QRegExp::isEmpty() const
Renvoie true si la chaîne de caractères est vide, sinon renvoie false.
Si vous appelez exactMatch() avec un motif vide sur une chaîne vide, il renvoie true ; sinon, il renvoie false puisqu'il opère sur la chaîne entière. Si vous appelez indexIn() avec un motif vide sur n'importe quelle chaîne, il renverra le décalage de début (0 par défaut) parce que 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 gourmande) est activée ; sinon, renvoie false.
Voir aussi 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 ne comporte pas de crochet de fermeture.
Notez que la validité d'une expression rationnelle peut également dépendre de la valeur de l'indicateur joker, par exemple *.html est une expression rationnelle joker valide mais une expression rationnelle complète invalide.
Voir également errorString().
int QRegExp::lastIndexIn(const QStringList &list, int from) const
Renvoie la position d'index de la dernière correspondance exacte de cette expression rationnelle dans list, en effectuant une recherche à rebours à partir de la position d'index from. Si from vaut -1 (valeur par défaut), la recherche commence au dernier élément. Retourne -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 à l'envers dans str à partir de la position offset. Si offset est égal à -1 (valeur par défaut), la recherche commence au dernier caractère ; si -2, à l'avant-dernier caractère ; etc.
Renvoie la position de la première correspondance, ou -1 s'il n'y a pas de correspondance.
Le paramètre caretMode peut être utilisé pour indiquer si ^ doit correspondre à l'index 0 ou à offset.
Bien que constante, cette fonction définit matchedLength(), capturedTexts() et pos().
Attention : La recherche à l'envers est beaucoup plus lente que la recherche à l'endroit.
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 aussi exactMatch(), indexIn(), et lastIndexIn().
QString QRegExp::pattern() const
Renvoie la chaîne de caractères de l'expression régulière. Le motif a soit une syntaxe d'expression régulière, soit une syntaxe de caractères génériques, en fonction de patternSyntax().
Voir aussi 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 aussi setPatternSyntax(), pattern() et caseSensitivity().
int QRegExp::pos(int nth = 0) const
Renvoie la position du texte capturé sur nth dans la chaîne recherchée. Si nth vaut 0 (valeur par défaut), pos() renvoie la position de l'ensemble de la correspondance.
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 caractéristique de l'implémentation.
Voir également cap() et capturedTexts().
QString QRegExp::removeIn(const QString &str) const
Supprime toutes les occurrences de cette expression régulière str, et renvoie le résultat
Fait la même chose que replaceIn(str, QString()).
Voir aussi indexIn(), lastIndexIn(), et replaceIn().
QString QRegExp::replaceIn(const QString &str, const QString &after) const
Remplace toutes les occurrences 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 aussi indexIn(), lastIndexIn() et QRegExp::cap().
QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const
Remplace toutes les occurrences de cette expression rationnelle, dans chacun des stringList's, 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 à cs.
Si cs est Qt::CaseSensitive, \ .txt$ correspond à readme.txt mais pas à README.TXT.
Voir aussi caseSensitivity(), setPatternSyntax(), setPattern(), et setMinimal().
void QRegExp::setMinimal(bool minimal)
Active ou désactive la correspondance minimale. Si minimal est faux, la correspondance est gourmande (maximale), ce qui est la valeur par défaut.
Par exemple, supposons que nous ayons la chaîne d'entrée "Nous devons être <b>gras</b>, très <b>gras</b> !" et le motif <b>.*</b>. Avec la correspondance gourmande (maximale) par défaut, la correspondance est "Nous devons être <b>gras</b>, très <b>gras</b> !". Mais avec la correspondance minimale (non gourmande), la première correspondance est : "Nous devons être <b>gras</b>, très <b>gras</b> !" et la deuxième correspondance est "Nous devons être <b>gras</b>, très <b>gras</b> !". En pratique, nous pourrions utiliser le motif <b>[^<]*</b> à la place, bien qu'il échouera toujours pour les balises imbriquées.
Voir également isMinimal() et setCaseSensitivity().
void QRegExp::setPattern(const QString &pattern)
Définit la chaîne de motifs à pattern. Les options de sensibilité à la casse, de caractères génériques et de correspondance minimale ne sont pas modifiées.
Voir aussi pattern(), setPatternSyntax() et setCaseSensitivity().
void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)
Définit le mode de syntaxe pour l'expression régulière. La valeur par défaut est QRegExp::RegExp.
La définition de syntax en QRegExp::Wildcard permet d'utiliser un simple shell comme QRegExp wildcard matching. Par exemple, r*.txt correspond à la chaîne readme.txt en mode joker, mais pas à readme.
La définition de syntax à QRegExp::FixedString signifie que le motif est interprété comme une chaîne simple. Les caractères spéciaux (par exemple, la barre oblique inverse) n'ont pas besoin d'être échappés.
Voir aussi patternSyntax(), setPattern(), setCaseSensitivity() et escape().
QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
Fractionne str en sous-chaînes à chaque fois que cette expression régulière correspond, et renvoie la liste de ces chaînes. Si cette expression régulière ne correspond à aucune partie de la chaîne, 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 aussi QStringList::join() et QString::split().
[noexcept] void QRegExp::swap(QRegExp &other)
Remplace l'expression régulière other par cette expression régulière. Cette opération est très rapide et n'échoue jamais.
QRegExp::operator QVariant() const
Renvoie l'expression rationnelle 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)
Move-assigne other à cette instance QRegExp.
QRegExp &QRegExp::operator=(const QRegExp &rx)
Copie l'expression régulière rx et renvoie une référence à la copie. Les options de sensibilité à la casse, de caractères génériques et de 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 ont les mêmes chaînes de motifs et les mêmes paramètres pour la sensibilité à la casse, les caractères génériques et la correspondance minimale.
Non-membres apparentés
[noexcept] size_t qHash(const QRegExp &key, size_t seed = 0)
Renvoie la valeur de hachage pour key, en utilisant seed comme base de calcul.
QDataStream &operator<<(QDataStream &out, const QRegExp ®Exp)
Écrit l'expression régulière regExp dans le flux out.
Voir aussi Serializing Qt Data Types (Sérialisation des types de données Qt).
QDataStream &operator>>(QDataStream &in, QRegExp ®Exp)
Lit une expression régulière du flux in dans regExp.
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.