Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 122

Автор Майкл ДТонсон

НиТС прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

if ((rerr = regcomp(&p, "(^(.*[^\\])#.*$)|(^[^#]+$)",

 REG_EXTENDED|REG_NEWLINE))) {

 if (rerr == REG_NOMATCH) {

  /* строка просто Π½Π΅ совпадаСт с рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ */

 } else {

  /* какая-Ρ‚ΠΎ другая ошибка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сформированноС рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ */

 }

}

Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ строки Π² Ρ„Π°ΠΉΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, частично, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ посрСдством символов # Π±Π΅Π· прСфикса \. Π­Ρ‚Ρƒ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ рСгулярного выраТСния ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС простого Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° синтаксиса для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ прилоТСния.

Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ мнСнию, являСтся Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π²Π°ΠΌ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибок. Ѐункция regcomp() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ компиляции ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ ошибки β€” Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ошибок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано с Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ошибками Π² рСгулярных выраТСниях, Π½ΠΎ Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ памяти. Π”Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅ даСтся описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regerror().

#include <regex.h>


int regexec(const regex_t *preg, const chat *string, size_t nmatch,

 regmatch_t pmatch[], int eflags);

Ѐункция regexec() сравниваСт строку с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. АргумСнт eflags ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ любой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ пСрСчислСнных Π½ΠΈΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ "Π˜Π›Π˜".

REG_NOTBOL ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ строки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ символу ^. Π›ΡŽΠ±ΠΎΠΉ символ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° символом Π½ΠΎΠ²ΠΎΠΉ строки, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ условии, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regcomp() Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ REG_NEWLINE. REG_NOTEOL ПослСдний символ строки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ символу $. Π›ΡŽΠ±ΠΎΠΉ символ, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ символу Π½ΠΎΠ²ΠΎΠΉ строки, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ символу $ ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ условии, Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regcomp() Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ REG_NEWLINE.

Массив структур regmatch_t ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдставлСния мСстополоТСния ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² рСгулярном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

#include <regex.h>


typedef struct {

 regoff_t rm_so; /* индСкс Π±Π°ΠΉΡ‚Π° Π² строкС Π² Π½Π°Ρ‡Π°Π»Π΅ сопоставлСния*/

 regoff_t rm_eo; /* индСкс Π±Π°ΠΉΡ‚Π° Π² строкС Π² ΠΊΠΎΠ½Ρ†Π΅ сопоставлСния*/

} regmatch_t;

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт regmatch_t описываСт всю ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ строку; ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ вся эта строка содСрТит любой символ Π½Π°Ρ‡Π°Π»Π° строки, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ хвостовой символ Π½ΠΎΠ²ΠΎΠΉ строки, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π·Π°Π΄Π°Π½ΠΎ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ REG_NEWLINE.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты массива хранят подвыраТСния, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² скобки, Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² рСгулярном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π² порядкС располоТСния ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок. (Π’ ΠΊΠΎΠ΄Π΅ Π½Π° языкС Π‘ элСмСнт i эквивалСнтСн Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π·Π°ΠΌΠ΅Π½Ρ‹ \i Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… sed ΠΈΠ»ΠΈ awk.) Π’ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… подвыраТСниях Ρ‡Π»Π΅Π½ regmatch_t.rm_so ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ производится сопоставлСниС строки с рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, содСрТащим подвыраТСния. ПослС сопоставлСния Π½Π° экран выводятся всС совпавшиС подвыраТСния.

 1: /* match.с */

 2:

 3: #include <alloca.h>

 4: #include <sys/types.h>

 5: #include <regex.h>

 6: #include <stdlib.h>

 7: #include <string.h>

 8: #include <stdio.h>

 9:

10: void do_regerror(int errcode, const regex_t *preg) {

11:  char *errbuf;

12:  size_t errbuf_size;

13:

14:  errbuf_size = regerror(errcode, preg, NULL, 0);

15:  errbuf = alloca(errbuf_size);

16:  if (!errbuf) {

17:   perror("alloca");

18:   return;

19:  }

20:

21:  regerror(errcode, preg, errbuf, errbuf_size);

22:  fprintf(stderr, "%s\n", errbuf);

23: }

24:

25: int main() {

26:

27:  regex_t p;

28:  regmatch_t *pmatch;

29:  int rerr;

30:  char *regex = "(^(.*[^\\])#.*$)|(^[^#]+$)";

31:  char string[BUFSIZ+1];

32:  int i;

33:

34:  if ((rerr = regcomp(&p, regex, REG_EXTENDED | REG_NEWLINE))) {

35:   do_regerror(rerr, &p);

36:  }

37:

38:  pmatch = alloca(sizeof(regmatch_t) * (p.re_nsub+1));

39:  if (!pmatch) {

40:   perror("alloca");

41:  }

42:

43:  printf("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ строку: ");

44:  fgets(string, sizeof(string), stdin);

45:

46:  if ((rerr = regexec(&p, string, p.re_nsub+1, pmatch, 0))) {

47:   if (rerr == REG_NOMATCH) {

48:    /* эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ regerror,

49:     * Π½ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΎΠ½Π° обрабатываСтся особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

50:     */

51:    printf("Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π½Π΅ совпадаСт с %s\n", regex);

52:   } else {

53:    do_regerror(rerr, &p);

54:   }

55:  } else {

56:   /* сопоставлСниС Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ */

57:   printf("Π‘Ρ‚Ρ€ΠΎΠΊΠ° совпадаСт с рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ %s\n", regex);

58:   for (i = 0; i <= p.re_nsub; i++) {

59:    /* Π²Ρ‹Π²ΠΎΠ΄ Π½Π° экран совпавшСй части (частСй) строки */

60:    if (pmatch[i].rm_so != -1) {

61:     char *submatch;

62:     size_t matchlen = pmatch[i].rm_eo - pmatch[i].rm_so;

63:     submatch = malloc(matchlen+1);

64:     strncpy(submatch, string+pmatch[i].rm_so,

65:      matchlen);

66:     submatch[matchlen] = '\0';

67:     printf("совпавшСС ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ %d: %s\n", i,

68:      submatch);

69:     free(submatch);

70:    } else {

71:     printf ("Π½Π΅Ρ‚ совпадСния с ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ %d\n", i);

72:    }

73:   }

74:  }

75:  exit(0);

76: }

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рСгулярного выраТСния ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ match.с имССтся Ρ‚Ρ€ΠΈ подвыраТСния. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… прСдставляСт собой всю строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ тСкст, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт символ коммСнтария, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ являСтся тСкст Π² строкС, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ символу коммСнтария, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ прСдставляСт всю строку Π±Π΅Π· символа коммСнтария. Для строки, Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, элСмСнту rm_so Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ элСмСнтС ΠΈΠ· массива pmatch[] присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1. Для строки, Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ содСрТится ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1 присваиваСтся ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ элСмСнту; для строки, Π½Π΅ содСрТащСй символы коммСнтария, Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ элСмСнту присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти. Для освобоТдСния памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ regfree(), Π½ΠΎ Π½Π΅ free():

#include <regex.h>


void regfree(regex_t *preg);

Π’ стандартС POSIX Ρ‡Π΅Ρ‚ΠΊΠΎ Π½Π΅ сказано, слСдуСт Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ regfree() ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regcomp(), ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π² послСдний Ρ€Π°Π· Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ regcomp() Π² ΠΎΠ΄Π½ΠΎΠΉ структурС regex_t. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти, Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ°Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм структур regex_t Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ regfree().

Всякий Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° функция regcomp() ΠΈΠ»ΠΈ regex() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, функция regerror() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ сообщСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π² Ρ‡Π΅ΠΌ состоит ошибка. Она записываСт ΠΏΠΎ возмоТности всС сообщСниС ΠΎΠ± ошибкС Π² Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ всСго сообщСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ сообщСниС, Ρ‚ΠΎ сначала Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок быстро становится ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ, ΠΈ Π²Π°ΠΌ придСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π°ΠΆΠ΄Ρ‹ (ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regcomp() ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regex()), ΠΌΡ‹ совСтуСм Π²Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ собствСнной ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ regerror(), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² строкС 10 ΠΈΠ· листинга math.с.

23.2.3. ΠŸΡ€ΠΎΡΡ‚Π°Ρ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° grep

grep являСтся популярной ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² стандартС POSIX, которая ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ возмоТности поиска рСгулярного выраТСния Π² тСкстовых Ρ„Π°ΠΉΠ»Π°Ρ…. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° простая (Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ стандарту POSIX) вСрсия ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ grep, рСализованная с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стандартного рСгулярного выраТСния.

  1: /* grep.с */

  2:

  3: #include <alloca.h>

  4: #include <ctype.h>

  5: #include <popt.h>

  6: #include <regex.h>

  7: #include <stdio.h>

  8: #include <string.h>

  9: #include <unistd.h>

 10: