Zaglądam do nich, aby zobaczyć, czy mogę ich użyć. Czytam:

Będzie super, jeśli ktoś pomoże mi zrozumieć:

Funkcja regcomp() powinna skompilować wyrażenie regularne zawarte w łańcuchu wskazywanym przez argument wzorca i umieścić wyniki w strukturze wskazywanej przez preg.

Czy to oznacza, że ​​nie mogę używać tokenów runtime do wyszukiwania? Jeśli poproszę użytkownika (w czasie wykonywania) o podanie mi tego, czego chce szukać, nie mogę tego zrobić?

1
hari 23 lipiec 2011, 04:18

3 odpowiedzi

Najlepsza odpowiedź

Tak, możesz obsługiwać wyrażenia regularne w czasie wykonywania. Wyrażenia regularne POSIX są obsługiwane przez dwie główne funkcje, regcomp() i regexec() (plus regfree() i regerror()). W poniższym przykładzie regex_string to coś w rodzaju „temp.*”, a string_to_match to „temp, który będzie pasować”

regex_t reg;
if(regcomp(&reg, regex_string, REG_EXTENDED | REG_ICASE) != 0) {
  fprintf(stderr, "Failed to create regex\n");
  exit(1);
}

if(regexec(&reg, string_to_match, 0, NULL, 0) == 0) {
  fprintf(stderr, "Regex matched!\n");
} else {
  fprintf(stderr, "Regex failed to match!\n");
}

regfree(&reg);

Chciałem dodać, że regex_string to po prostu char *, który może być dowolnym ciągiem zakończonym NULL. string_to_match ponownie może być dowolnym ciągiem zakończonym znakiem NULL. Ważne jest, aby rozróżnić, że zmiana regex_string po regcomp() NIE zmienia wyrażenia regularnego, do którego faktycznie dopasowuje się regexec(). W tym celu musisz regfree(), a następnie ponownie regcomp().

3
Jonathan Leffler 23 lipiec 2011, 05:47
Dziękuję. btw, polubił twojego bloga.
 – 
hari
23 lipiec 2011, 04:43
1
Opis regcomp() używa słowa "kompilacja" w odniesieniu do tego, co robi regcomp() w czasie wykonywania, a nie do tego, co robi kompilator C. Jest to podobny proces, polegający na pobieraniu danych tekstowych i tłumaczeniu ich na bardziej bezpośrednio używalną formę, ale nie ma (zamierzonej) implikacji, że dzieje się to przed uruchomieniem programu.
 – 
Keith Thompson
24 lipiec 2011, 01:35

"Funkcja regcomp() powinna skompilować wyrażenie regularne zawarte w ciągu znaków..."

P: Czy to oznacza, że ​​nie mogę używać tokenów czasu wykonywania do wyszukiwania ciągów?

Nie, oznacza to tylko, że po uzyskaniu ciągu regcomp() skompiluje wyrażenie regularne tak, aby można je było użyć z jednym lub większą liczbą ciągów wejściowych.

Możesz utworzyć zarówno wyrażenie regularne, jak i dowolne ciągi docelowe w czasie kompilacji lub w czasie wykonywania.

1
paulsm4 23 lipiec 2011, 04:35

Chyba znalazłem dobry przykład na mij.oltrelinux.com/devel/unixprg/

 /* compiles the RE. If this step fails, reveals what's wrong with the RE */
if ( (err = regcomp(&myre, argv[1], REG_EXTENDED)) != 0 ) {
    regerror(err, &myre, err_msg, MAX_ERR_LENGTH);
    printf("Error analyzing regular expression '%s': %s.\n", argv[1], err_msg);
    return 1;
}
0
hari 23 lipiec 2011, 04:25