#c #regex #string
#c #регулярное выражение #строка
Вопрос:
Я использую регулярное выражение с помощью #include <regex.h>
Если у меня есть строка s, как я могу использовать регулярное выражение для поиска шаблона p?
Комментарии:
1. Какое regex.h? Тот, что в Unix? Вам лучше указать это, поскольку это не стандартный заголовок C или C.
2. Я просто использую тот, который уже есть, поэтому по умолчанию, что бы это ни было. Я работаю в OSX, которая в основном такая же, как Linux.
3. Какой у вас компилятор и операционная система? В любом случае, если вам нужна кросс-платформенная и кросс-компиляторная совместимость и хороший OO-интерфейс, я предлагаю попробовать Boost.Regex. boost.org/doc/libs/1_46_1/libs/regex/doc/html/index.html
4. Я работаю в OSX и использую g .
5. Вам доступны две очень разные библиотеки регулярных выражений.
#include <regex.h>
это библиотека C, стандартизированная POSIX.1-2001.#include <regex>
стандартизирована ли библиотека C в C TR1. Вероятно, вы найдете библиотеку регулярных выражений C более полезной.
Ответ №1:
#include <regex.h>
#include <iostream>
#include <string>
std::string
match(const char *string, char *pattern)
{
// Adapted from:
http://pubs.opengroup.org/onlinepubs/009695399/functions/regcomp.html
int status;
regex_t re;
regmatch_t rm;
if (regcomp(amp;re, pattern, REG_EXTENDED) != 0) {
return "Bad pattern";
}
status = regexec(amp;re, string, 1, amp;rm, 0);
regfree(amp;re);
if (status != 0) {
return "No Match";
}
return std::string(string rm.rm_so, string rm.rm_eo);
}
int main(int ac, char **av) {
// e.g. usage: ./program abcdefg 'c.*f'
std::cout << match(av[1], av[2]) << "n";
}
Ответ №2:
Проверьте http://msdn.microsoft.com/en-us/library/bb982821.aspx , содержит подробное описание использования регулярных выражений. из блога MS vc.
const regex r("[1-9]\d*x[1-9]\d*");
for (string s; getline(cin, s); ) {
cout << (regex_match(s, r) ? "Yes" : "No") << endl;
}
Комментарии:
1. Здесь подробно описывается использование
<regex>
. OP запросил пример<regex.h>
. Это не один и тот же API.