Регулярные выражения в си++.
Дана строка, в которой содержится http заголовок (типа GET /HTTP/1.0 и т.д.).
Надо выделить из строки адрес запрашиваемого ресурса.
Знаю, как это сделать в perle с помощью regex, но надо написать на си++.
Я плохо ориентируюсь в си++, как это сделать?
Если можно покажите пример какой-нибудь.
Здравствуйте. Помогите решить проблему.
Дана строка, в которой содержится http заголовок (типа GET /HTTP/1.0 и т.д.).
Надо выделить из строки адрес запрашиваемого ресурса.
Знаю, как это сделать в perle с помощью regex, но надо написать на си++.
Я плохо ориентируюсь в си++, как это сделать?
Если можно покажите пример какой-нибудь.
есть набор POSIX функций для обработки регекспов:
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
void regfree(regex_t *preg);
для С++ вроде в BOOST есть спец. классы.
Спасибо за указания вектора поиска.
1. Я использовал BOOST http://www.boost.org/.
Здесь - BOOST RUS - дано частичное описание этой библиотеки на русском языке.
Вот прямая ссылка на документацию BOOST::REGEX.
2. Здесь - "C++ Boost настройка, установка, использование - просто" - дано (неполное) описание "Установка на примере windows".
Я установил библиотеку для c++ builder 6 так.
Cкачал исходники библиотеки (около 13Mb),
и инструмент установки, компиляции бибилиотеки BOOST Jam (100Kb).
Прямые ссылки на скачивание:
boost_1_33_1.tar.gz
boost-jam-3.1.12-1-ntx86.zip
Разархивировал оба файла, скопировал bjam.exe (из архива boost-jam-3.1.12-1-ntx86.zip) в папку с исходниками (из архива boost_1_33_1.tar.gz).
Теперь из папки с исходниками открываем консоль cmd и пишем команду: bjam "-sTOOLS=borland" install
Ждем завершения компиляции (около 2 мин). В папке C:\Boost\ увидим результаты компиляции.
Переносим все содержимое папки C:\Boost\lib\
С:\Program Files\Borland\CBuilder6\Lib\
Копируем папку boost из из исходников в
E:\Program Files\Borland\CBuilder6\Include\
Готово.
Пример использования:
#include <boost/regex.hpp>
#include <string>
#include <iostream>
int main (void){
using namespace std;
using namespace boost;
regex expression("([_a-zA-Z\\d\\-\\.]+)@([_a-zA-Z\\d\\-]+(\\.[_a-zA-Z\\d\\-]+)+)");
string str("Мой E-mail: [email]sem@ciam.ru[/email]. Задавайте любые вопросы.");
cmatch what;
if(regex_search(str, what, expression)){
string name, domain;
name.assign(what[1].first, what[1].second);
domain.assign(what[2].first, what[2].second);
cout << "Имя: " << name;
cout << ", домен: " << domain << endl;
} else
cout << "E-Mail в строке не найден" << endl;
};
Есть еще библиотека Perl PCRE - Perl Compatible Regular Expressions/
Здесь - http://www.linuxrsp.ru/artic/pcre5.html
описаны функции библиотеки PCRE.