Присвойте RegEx субматчам переменным или сопоставьте (C ++ / C) - PullRequest
3 голосов
/ 25 апреля 2010

Мне нужно извлечь информацию типа того же (например, Имя, Фамилия, Телефон, ...) из множества различных текстовых источников, каждый из которых имеет свой формат и различный порядок переменных. представляет интерес.

Мне нужна функция, которая выполняет извлечение на основе регулярного выражения и возвращает результат в виде описательных переменных. Другими словами, вместо того, чтобы возвращать каждый результат совпадения как submatch[0], submatch[1], submatch[2], ...,, сделайте одно из следующих:

  1. возврат std::map, чтобы получить доступ к субматчам через:

    submatch["first_name"], submatch["last_name"], submatch["telephone"]

  2. возвращают переменные с субматчами, чтобы к субматчам можно было получить доступ через:

    submatch_first_name, submatch_last_name, submatch_telephone

Я могу написать класс-оболочку около boost::regex, чтобы сделать первый, но я надеялся, что будет встроенный или более элегантный способ сделать это в C ++ / Boost / STL / C.

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Boost :: Regex также имеет встроенную поддержку именованных групп захвата через следующий синтаксис

(?<name>.*)

с регулярным выражением, добавленным после имени, например

const boost::wregex dateTimeRegex(L"(?<year>[[:d:]]{4})\\.(?<month>[[:d:]]{2})\\.(?<day>[[:d:]]{2}) (?<hr>[[:d:]]{2}):(?<min>[[:d:]]{2}):(?<sec>[[:d:]]{2})");
boost::wsmatch result;
if(boost::regex_match(currentLine, result, dateTimeRegex))
{
    if(result[0].matched)
    {
        const int year = boost::lexical_cast<int>(result.str(L"year"));
        const int month = boost::lexical_cast<int>(result.str(L"month"));
        //...
    }
}    
1 голос
/ 25 апреля 2010

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

enum NamedIndices {
    FirstName = 0,
    LastName  = 1,
    // ...
};

// ...
std::string first = submatch[FirstName];
std::string last  = submatch[LastName ];
0 голосов
/ 25 апреля 2010

Можете ли вы использовать "именованные группы захвата"? Похоже, что возвращение карты - это именно то, что вы хотите.

Например, в RE2

Проверьте wikipedia посмотрите, поддерживает ли ваша любимая библиотека регулярных выражений именованные захваты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...