Ответ 1
Используйте boost:: smatch.
boost::regex pattern("what(ever) ...");
boost::smatch result;
if (boost::regex_search(s, result, pattern)) {
string submatch(result[1].first, result[1].second);
// Do whatever ...
}
Я пытаюсь извлечь подматрицы из текстового файла с помощью boost regex. В настоящее время я возвращаю только первую действительную строку и полную строку вместо действительного адреса электронной почты. Я попытался использовать итератор и использовать субматрицы, но у меня не было успеха. Вот текущий код:
if(Myfile.is_open()) {
boost::regex pattern("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$");
while(getline(Myfile, line)) {
string::const_iterator start = line.begin();
string::const_iterator end = line.end();
boost::sregex_token_iterator i(start, end, pattern);
boost::sregex_token_iterator j;
while ( i != j) {
cout << *i++ << endl;
}
Myfile.close();
}
Используйте boost:: smatch.
boost::regex pattern("what(ever) ...");
boost::smatch result;
if (boost::regex_search(s, result, pattern)) {
string submatch(result[1].first, result[1].second);
// Do whatever ...
}
const string pattern = "(abc)(def)";
const string target = "abcdef";
boost::regex regexPattern(pattern, boost::regex::extended);
boost::smatch what;
bool isMatchFound = boost::regex_match(target, what, regexPattern);
if (isMatchFound)
{
for (unsigned int i=0; i < what.size(); i++)
{
cout << "WHAT " << i << " " << what[i] << endl;
}
}
Выход следующий
WHAT 0 abcdef
WHAT 1 abc
WHAT 2 def
Boost использует подматрицы в скобках, а первая подкачка всегда соответствует полной строке. regex_match должен соответствовать всей строке ввода против шаблона, если вы пытаетесь сопоставить подстроку, вместо этого используйте regex_search.
В приведенном выше примере используется расширенный синтаксис regex posix, который задается с помощью параметра boost:: regex:: extended. Опущение этого параметра изменяет синтаксис для использования синтаксиса regex в стиле perl. Доступен другой синтаксис regex.
Эта строка: string result (результат [1]. first, result [1].second);
вызывает ошибки в visual С++ (я тестировал против 2012 года, но ожидаю, что и предыдущая версия тоже)
Смотрите https://groups.google.com/forum/?fromgroups#!topic/cpp-netlib/0Szv2WcgAtc для анализа.