Frage

Ich versuche, die folgenden Elemente in der Zeichenfolge pcode übereinstimmen:

  • u gefolgt von einer 1 oder 2-stellige Nummer
  • phaseu
  • phasep
  • x (umgeben von nicht-Wort Zeichen)
  • y (umgeben von nicht-Wort Zeichen)
  • z (umgeben von nicht-Wort Zeichen)

Ich habe versucht, eine Regex mit den POSIX Regex-Funktionen (siehe unten) zu implementieren, haben aber zwei Probleme:

  1. Die kompilierte Muster scheint keine Unter-Patterns zu haben (das heißt compiled.n_sub == 0).
  2. Das Muster nicht Einstimmungen in der Zeichenfolge „u0“ finden, die es wirklich soll!

Ich bin zuversichtlich, dass der Regex String selbst arbeitet in, dass es in Python funktioniert und Textmate-mein Problem liegt bei der Zusammenstellung usw. in C. Jede Hilfe mit, dass die Arbeit bekommen würde sehr geschätzt werden.

Vielen Dank im Voraus für Ihre Antworten.

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);
}
War es hilfreich?

Lösung

Es scheint, Sie beabsichtigen, etwas zu verwenden, um die „erweiterte“ POSIX regex Syntax ähnelt. POSIX definiert zwei verschiedene regex Syntaxen, einen „Basis“ (lesen „veraltet“) Syntax und die „erweiterte“ Syntax. Um die erweiterte Syntax zu verwenden, müssen Sie die REG_EXTENDED Flagge für regcomp hinzuzufügen:

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

Ohne diesen Flag regcomp die "basic" regex Syntax. Es gibt einige wichtige Unterschiede, wie zum Beispiel:

  • Keine Unterstützung für den | Operator
  • Die Halterungen für submatches werden müssen entkommen, \( und \)

Es sollte auch beachtet werden, dass die POSIX regex Syntax erweitert ist nicht 1: 1 kompatibel mit Python Regex (nicht über Textmate weiß). Insbesondere, ich bin dieser Teil Ihrer regexp Angst in POSIX nicht funktioniert, oder zumindest ist nicht tragbar:

 [\\W]

Die POSIX Art und Weise nicht-Leerzeichen angeben ist:

 [^[:space:]]

Ihre ganze regexp für POSIX dann wie folgt in C aussehen sollte:

 char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top