функции сопоставления регулярных выражений стандартной библиотеки C - PullRequest
1 голос
/ 23 июля 2011

Я смотрю на них, чтобы посмотреть, смогу ли я их использовать.Я читаю:

Будет здорово, если кто-нибудь поможет мне понять:

Функция regcomp ()должен скомпилировать регулярное выражение, содержащееся в строке, на которую указывает аргумент шаблона, и поместить результаты в структуру, на которую указывает preg.

Означает ли это, что я не могу использовать токены времени выполнения для поиска?Если я попрошу пользователя (во время выполнения) предоставить мне то, что он хочет найти, я не смогу это сделать?

Ответы [ 3 ]

3 голосов
/ 23 июля 2011

Да, вы можете обрабатывать регулярные выражения во время выполнения. Регулярные выражения POSIX обрабатываются двумя основными функциями: regcomp() и regexec() (плюс regfree() и regerror()). В приведенном ниже примере regex_string - это что-то вроде «temp. *», А string_to_match - «temp, который будет соответствовать»

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);

Я хотел добавить, что regex_string - это просто char *, который может быть любой строкой с нулевым символом в конце. string_to_match снова может быть любой строкой с нулевым символом в конце. Важно различать, что изменение regex_string после того, как у вас есть regcomp() 'd, НЕ меняет регулярное выражение, с которым действительно сопоставляется regexec(). Для этого вам нужно будет regfree(), а затем повторно regcomp().

1 голос
/ 23 июля 2011

"Функция regcomp () должна компилировать содержащееся в ней регулярное выражение в строке ... "

В: Означает ли это, что я не могу использовать токены времени выполнения для строка поиска против?

Нет, это только означает, что, получив строку, regcomp () скомпилирует регулярное выражение, чтобы его можно было использовать с одной или несколькими входными строками.

Вы можете создать как регулярное выражение, так и / или любые целевые строки во время компиляции или во время выполнения.

0 голосов
/ 23 июля 2011

Полагаю, я нашел хороший пример на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...