Sous-routine regexec
Objectif
Compare la chaîne de caractères à terminaison nulle spécifiée par la valeur du paramètre String à l'expression rationnelle compilée Preg, qui doit avoir été compilée au préalable par un appel à la sous-routine 'regcomp
Bibliothèque
Bibliothèque C standard (libc. a)
Syntaxe
Descriptif
La sous-routine " regexec compare la chaîne de caractères à terminaison nulle du paramètre " String" avec l'expression rationnelle compilée, basique ou étendue, du paramètre " Preg ", initialisée par un appel précédent à la sous-routine " regcomp. Si une correspondance est trouvée, la sous-routine " regexec renvoie la valeur 0. La sous-routine " regexec renvoie une valeur non nulle si elle ne trouve pas de correspondance ou si elle trouve une erreur.
Si le paramètre NMatch a une valeur de 0, ou si l'indicateur " REG_NOSUB a été activé lors de l'appel à la sous-routine " regcomp, la sous-routine " regexec ignore le paramètre PMatch. Sinon, le paramètre Sittelle pointe vers un tableau d'au moins le nombre d'éléments spécifiés par le paramètre NMatch . La sous-routine " regexec remplit les éléments du tableau indiqué par le paramètre PMatch avec les décalages des sous-chaînes du paramètre String. Les décalages correspondent aux sous-expressions parenthétiques du paramètre de motif original qui a été spécifié à la sous-routine " regcomp
La structure " pmatch.rm_so est le décalage d'octets du début de la sous-chaîne et la structure " pmatch.rm_eo est supérieure d'une unité au décalage d'octets de la fin de la sous-chaîne. La sous-expression I commence à la I e parenthèse ouvrque correspondante, en comptant à partir de 1. L'élément 0 du tableau correspond à l'ensemble du modèle. Les éléments inutilisés du paramètre PMatch, jusqu'à la valeur PMatch[NMatch -1], sont complétés par -1. If more than the number of subexpressions are specified by the NMatch parameter (the modèle parameter itself counts as a subexpression), only the first NMatch -1 subexpressions are recorded.
Lorsqu'une expression régulière de base ou étendue est mise en correspondance, une sous-expression entre parenthèses donnée du paramètre Modèle peut correspondre à plusieurs sous-chaînes différentes du paramètre Chaîne . Sinon, il se peut qu'il ne corresponde à aucune sous-chaîne même si le modèle dans son ensemble correspond.
Les règles suivantes sont utilisées pour déterminer les sous-chaînes à déclarer dans le paramètre Sittelle lorsque des expressions régulières sont associées:
- Si une sous-expression d'une expression régulière a participé plusieurs fois à la correspondance, le décalage de la dernière sous-expression correspondante est indiqué dans le paramètre PMatch.
- Si une sous-expression n'a pas participé à une correspondance, le décalage d'octet dans le paramètre PMatch est une valeur de -1 Une sous-expression ne participe pas à une correspondance si l'une des suivantes est vraie:
- Un "
*(astérisque) ou un "\{\}(barre oblique inverse, accolade gauche, barre oblique inverse, accolade droite) apparaît immédiatement après la sous-expression dans une expression régulière de base. - Un "
* (asterisk), ? (question mark),ou un "{ }(accolades à gauche et à droite) apparaît immédiatement après la sous-expression dans une expression rationnelle étendue et la sous-expression ne correspond pas (correspond à 0 fois). - Un "
|(pipe) est utilisé dans une expression rationnelle étendue pour sélectionner soit la sous-expression qui ne correspond pas, soit une autre sous-expression, et l'autre sous-expression correspond.
- Un "
- Si une sous-expression est contenue dans une autre sous-expression, les données du paramètre PMatch se réfèrent à la dernière sous-expression.
- Si une sous-expression est contenue dans une sous-expression et que les décalages d'octets dans le paramètre PMatch ont une valeur de -1, les pointeurs dans le paramètre PMatch ont également une valeur de -1.
- Si une sous-expression correspond à une chaîne de longueur nulle, les décalages dans le paramètre PMatch se réfèrent à l'octet qui suit immédiatement la chaîne correspondante.
Si l'indicateur " REG_NOSUB a été défini dans le paramètre cflags lors de l'appel à la sous-routine " regcomp " et que le paramètre NMatch n'est pas égal à 0 lors de l'appel à la sous-routine " regexec ", le contenu du tableau PMatch n'est pas spécifié.
Si l'indicateur " REG_NEWLINE n'a pas été défini dans le paramètre cflags lors de l'appel de la sous-routine " regcomp, un caractère de nouvelle ligne dans le motif ou le paramètre String est traité comme un caractère ordinaire. Si l'indicateur " REG_NEWLINE a été activé lors de l'appel de la sous-routine " regcomp, le caractère de nouvelle ligne est traité comme un caractère ordinaire, sauf dans les cas suivants :
- Un caractère de nouvelle ligne dans le paramètre Chaîne n'est pas compensé par un point en dehors d'une expression entre crochets ou par une forme quelconque de liste de non-correspondance. Une expression de liste non concordante commence par ^ (circonflexe) et spécifie une liste qui correspond à n'importe quel caractère ou élément de classement et à l'expression dans la liste après le caret de premier plan. Par exemple, l'expression régulière "
[^abc]correspond à tous les caractères sauf "a, "bou "c. L'accent circonflexe n'a cette signification particulière que lorsqu'il est le premier caractère de la liste, immédiatement après le crochet gauche. - Un "
^(accent circonflexe) dans le paramètre " pattern", lorsqu'il est utilisé pour spécifier l'ancrage d'une expression, correspond à la chaîne de longueur zéro située immédiatement après un caractère de nouvelle ligne dans le paramètre " String", quel que soit le réglage de l'indicateur "REG_NOTBOL - Un "
$(signe de dollar) dans le paramètre " pattern", lorsqu'il est utilisé pour spécifier l'ancrage d'une expression, correspond à la chaîne de longueur zéro immédiatement avant un caractère de nouvelle ligne dans le paramètre " String", quelle que soit la valeur de l'indicateur "REG_NOTEOL
Paramètres
| Article | Descriptif |
|---|---|
| Prég | Contient l'expression régulière de base ou étendue compilée à comparer au paramètre Chaîne . |
| Chaîne | Contient les données à correspondre. |
| NMatch | Contient le nombre de sous-expressions à mettre en correspondance. |
| Sittelle | Contient le tableau de décalage dans le paramètre Chaîne qui correspond à la sous-expression correspondante dans le paramètre Prég . |
| Indicateurs | Contient le OU inclusif dans le sens des bits de 0 ou plus des drapeaux contrôlant le comportement du sous-programme " regexec pouvant être personnalisé. Le paramètre Indicateurs modifie l'interprétation du contenu du paramètre Chaîne . Il s'agit du OU inclusif dans le sens des bits de 0 ou plusieurs des drapeaux suivants, qui sont définis dans le fichier " regex.h:
|
Valeurs renvoyées
En cas de succès, le sous-programme " regexec renvoie la valeur 0 pour indiquer que le contenu du paramètre " chaîne" correspond au contenu du paramètre " motif", ou pour indiquer qu'il n'y a pas eu de correspondance. L'erreur " REG_NOMATCH est définie dans le fichier " regex.h
Codes d'erreur
Si la sous-routine " regexec échoue, elle renvoie une valeur non nulle indiquant le type de problème. Les macros suivantes pour les codes d'erreur possibles qui peuvent être renvoyés sont définies dans le fichier " regex.h:
| Article | Descriptif |
|---|---|
REG_NOMATCH |
Indique que l'expression régulière de base ou étendue n'a pas pu trouver de correspondance. |
REG_BADPAT |
Indique une expression régulière de base ou étendue qui n'est pas valide. |
REG_ECOLLATE |
Indique un élément de classement référencé qui n'est pas valide. |
REG_ECTYPE |
Indique une référence de type de classe de caractères non valide. |
REG_EESCAPE |
Indique la présence d'un " \ (barre oblique inverse) dans le motif. |
REG_ESUBREG |
Indique qu'un nombre dans '\digit n'est pas valide ou est en erreur. |
REG_EBRACK |
Indique un déséquilibre " [ ] (parenthèses gauche et droite). |
REG_EPAREN |
Indique un déséquilibre \ ( \ ) (barre oblique inverse, parenthèse gauche, barre oblique inverse, parenthèse droite) ou ( ) (parenthèses gauche et droite). |
REG_EBRACE |
Indique un déséquilibre " \ { \ } (barre oblique inversée, accolade gauche, barre oblique inversée, accolade droite). |
REG_BADBR |
Indique que le contenu de " \ { \ } (barre oblique inverse, accolade gauche, barre oblique inverse, accolade droite) est inutilisable (pas un nombre, nombre trop grand, plus de deux nombres, ou premier nombre plus grand que le second). |
REG_ERANGE |
Indique un point final inutilisable dans une expression de plage. |
REG_ESPACE |
Indique que la mémoire est en mémoire. |
REG_BADRPT |
Indique " a ? (point d'interrogation), * (astérisque) ou + (signe plus) non précédé d'une expression régulière de base ou étendue valide. |
Si la valeur du paramètre Preg de la sous-routine " regexec n'est pas une expression rationnelle compilée, de base ou étendue, renvoyée par la sous-routine " regcomp, le résultat est indéfini.
Exemples
L'exemple suivant montre comment l'indicateur 'REG_NOTBOL peut être utilisé avec la sous-routine 'regexec pour trouver toutes les sous-chaînes d'une ligne qui correspondent à un motif fourni par l'utilisateur. (Pour des raisons de simplicité, peu de contrôles d'erreurs sont effectués dans cet exemple)
(void) regcomp (&re, pattern, 0) ;
/* this call to regexec finds the first match on the line */
error = regexec (&re, &buffer[0], 1, &pm, 0) ;
while (error = = 0) { /* while matches found */
<subString found between pm.r._sp and pm.rm_ep>
/* This call to regexec finds the next match */
error = regexec (&re, pm.rm_ep, 1, &pm, REG_NOTBOL) ;