Question

J'essaie de faire correspondre les éléments suivants dans la chaîne pcode :

  • u suivi d'un nombre à 1 ou 2 chiffres
  • phaseu
  • phasep
  • x (entouré de caractères autres que des mots)
  • y (entouré de caractères autres que des mots)
  • z (entouré de caractères autres que des mots)

J'ai essayé d'implémenter une correspondance de regex à l'aide des fonctions de regex POSIX (voir ci-dessous), mais j'ai deux problèmes:

  1. Le modèle compilé ne semble pas avoir de sous-modèle (c'est-à-dire compiled.n_sub == 0).
  2. Le motif ne trouve pas de correspondance dans la chaîne " u0 " ;, ce qu’il devrait vraiment faire!

Je suis convaincu que la chaîne regex elle-même fonctionne - en ce sens que cela fonctionne en python et TextMate - mon problème réside dans la compilation, etc. en C. Toute aide pour que cela fonctionne serait grandement appréciée.

Merci d'avance pour vos réponses.

if(idata=tb_find(deftb,pdata)){
    MESSAGE("Global variable!\n");
    char pattern[80] = "((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)";
    MESSAGE("Pattern = \"%s\"\n",pattern);
    regex_t compiled;
    if(regcomp(&compiled, pattern, 0) == 0){
        MESSAGE("Compiled regular expression \"%s\".\n", pattern);
    }

    int nsub = compiled.re_nsub;
    MESSAGE("nsub = %d.\n",nsub);
    regmatch_t matchptr[nsub];
    int err;
    if(err = regexec (&compiled, pcode, nsub, matchptr, 0)){
        if(err == REG_NOMATCH){
            MESSAGE("Regular expression did not match.\n");
        }else if(err == REG_ESPACE){
            MESSAGE("Ran out of memory.\n");
        }
    }
    regfree(&compiled);
}
Était-ce utile?

La solution

Il semble que vous ayez l'intention d'utiliser quelque chose qui ressemble à "prolongé". Syntaxe de regex POSIX. POSIX définit deux syntaxes de regex différentes, une "base". (lisez "obsolète") et la syntaxe "étendue" syntaxe. Pour utiliser la syntaxe étendue, vous devez ajouter le drapeau REG_EXTENDED pour regcomp :

...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...

Sans ce drapeau, regcomp utilisera le "base". syntaxe de regex. Il existe des différences importantes, telles que:

  • Pas de support pour l'opérateur |
  • Les crochets pour les sous-correspondances doivent être masqués, \ ( et \)

Il convient également de noter que la syntaxe de regex POSIX étendu n'est pas compatible 1: 1 avec les regex de Python (je ne connais pas TextMate). En particulier, je crains que cette partie de votre expression rationnelle ne fonctionne pas dans POSIX, ou du moins n’est pas portable:

 [\\W]

La méthode POSIX pour spécifier des caractères non-espace est:

 [^[:space:]]

Votre expression rationnelle entière pour POSIX devrait alors ressembler à ceci dans C:

 char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top