RegEx pro řetězec pomocí GNU C Library regex

hlasů
4

Píšu regulární výraz použít s regex knihovnu GNU C:

Řetězec je ve tvaru: (text kurzívou je popis obsahu)

(Ne #) počáteční (možná mezery) : Údaje

Napsal jsem následující kód, ale nebude to odpovídat.

regcomp(&start_state, ^[^#][ \\t]*\\(start\\)[ \\t]*[:].*$, REG_EXTENDED);

Co musím psát?

příklady: aby odpovídal:

state: q0
stav: q0
stav: q0s

Není tak, aby odpovídala:

#state: q0
stav q0
# Stát: q0

Dík!

Položena 04/02/2010 v 18:32
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
7

Vzor ve své otázce bylo náročné počáteční písmeno states [^#], který opustil zápas nemůže pokračovat, protože se snaží, aby odpovídaly tateproti vzoru \(state\).

Prošel jsi vlajku REG_EXTENDEDcož znamená, že neunikají závorek ale uniknout doslovné závorky.

S regulárními výrazy, říkat to, co si přejete, aby odpovídala:

^[ \\t]*(state)[ \\t]*:.*$

jako v

#include <stdio.h>
#include <regex.h>

int main(int argc, char **argv)
{
  struct {
    const char *input;
    int expect;
  } tests[] = {
    /* should match */
    { "state : q0", 1 },
    { "state: q0",  1 },
    { "state:q0s",  1 },

    /* should not match */
    { "#state :q0",  0 },
    { "state q0",    0 },
    { "# state :q0", 0 },
  };
  int i;
  regex_t start_state;
  const char *pattern = "^[ \\t]*(state)[ \\t]*:.*$";

  if (regcomp(&start_state, pattern, REG_EXTENDED)) {
    fprintf(stderr, "%s: bad pattern: '%s'\n", argv[0], pattern);
    return 1;
  }

  for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
    int status = regexec(&start_state, tests[i].input, 0, NULL, 0);

    printf("%s: %s (%s)\n", tests[i].input,
                            status == 0 ? "match" : "no match",
                            !status == !!tests[i].expect
                              ? "PASS" : "FAIL");
  }

  regfree(&start_state);

  return 0;
}

Výstup:

state: q0: match (PASS)
state: q0: match (PASS)
Státní: q0s: zápas (PASS)
#state: q0: žádná shoda (PASS)
stav q0: žádná shoda (PASS)
# Stát: q0: žádná shoda (PASS)
Odpovězeno 04/02/2010 v 19:28
zdroj uživatelem

hlasů
1

Ok, jsem na to přišel:

regcomp(&start_state, "^[^#]*[ \\t]*start[ \\t]*:.*$", REG_EXTENDED);

Výše řeší můj problém! (Ukazuje se, zapomněl jsem dát * po [^ #]) ...

Děkujeme za vaši pomoc tak jako tak, Rubens! :)

Odpovězeno 04/02/2010 v 19:07
zdroj uživatelem

hlasů
0

Toto pracuje s daty vzorku:

^[^#]\s*\w+\s*:(?<data>.*?)$

EDIT : Já nevím, ale budete muset povolit víceřádkové podporu, jako první ^a poslední $mají odlišné chování s tímto nastavením.

Odpovězeno 04/02/2010 v 18:41
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more