Как использовать регулярное выражение «Группировка» для множественного регулярного выражения в C ++?

0

Это своего рода продолжение предыдущего вопроса SO и его обсуждение.

Разное Между std :: regex_match и std :: regex_search

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

std::string input{ "Mon Nov 25 20:54:36 2013" };
//Day:: Exactly Two Number surrounded by spaces in both side
std::regex  r{R"(\s\d{2}\s)"};

В одном из ответов он был изменен как R"(.*?\s(\d{2})\s.*)" Для создания и, следовательно, захвата группы и первого подзаголовка. Все отлично работает для разбора дневной информации с помощью regex_match или regex_search.

Теперь я написал следующие regex expressions для анализа различной вещи из приведенной выше входной строки следующим образом:

std::string input{ "Mon Nov 25 20:54:36 2013" };


   //DayStr:: Exactly Three Letter at the start and followed by spaces(Output: Mon)
    std::regex   dayStrPattern{ R"(^\w{3}\s)" };
    //Day:: Exactly Two Number surrounded by spaces in both side(Output: 25)
    std::regex   dayPattern{ R"(\s\d{2}\s)" };
    //Month:: Exactly Three letter surrounded by spaces in both side(Output: Nov)
    std::regex   monthPattern{ R"(\s\w{3}\s)" };
    //Year:: Exactly Four Number at the end of the string(Output: 2013)
    std::regex   yearPattern{ R"(\s\d{4}$)" };
    //Hour:: Exactly two Number surrounded by spaces in left side and : in right side(Output:20)
    std::regex   hourPattern{ R"(\s\d{2}:{1})" };
    //Min:: Exactly two Number sorruounded by : in left side and : in right side(Output: 54)
    std::regex   minPattern{ R"(:{1}\d{2}:{1})" };
    //Second::Exactly two Number surrounded by : in the left side and space in right side(Output: 36)
    std::regex   secPattern{ R"(:{1}\d{2}\s)" };

Я тестировал вышеперечисленное выражение здесь, и они кажутся правильными.

Теперь мы можем использовать механизм группировки здесь, чтобы мы std::regex_search одно выражение регулярного выражения в методе std::regex_search вместо 7 различных регулярных выражений.?. Таким образом std :: regex_search будет хранить вывод в свой std::smatch. Возможно ли это здесь? Я читал documentation и книгу " Tour Of C++ book но не очень разбирался в regular expression grouping.

В общем, когда и как мы должны использовать/дизайн группировки, чтобы мы получали различную информацию в одном вызове std :: regex_search?

В этот момент я должен вызвать 7 раз std :: regex_search с различным выражением регулярного выражения, чтобы получить различную информацию, а затем использовать ее. Я уверен, что есть лучший способ добиться этого, чем то, что я делаю прямо сейчас.

  • 0
    Можем ли мы сделать какие-либо предположения о порядке полей даты? Без такого предположения ваш текущий метод может быть лучше, чем одно решение регулярных выражений.
  • 0
    @nhahtdh: да, мы можем предположить, что порядок будет только таким образом. Основная идея здесь заключается в том, чтобы понять, когда (а не только в этом примере) и как использовать группировку в регулярных выражениях.
Показать ещё 2 комментария
Теги:
c++11
parsing

1 ответ

2
Лучший ответ

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

std::regex r{R"(^(\w{3}) (\w{3}) (\d{2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$)"};

И тогда все совпадения могут быть получены через match_results после одного вызова regex_match

if (std::regex_match(input,match,r)){
    for(auto const& m : match) {
        std::cout << m << '\n';
    }
}

Демо-версия

  • 0
    Должен ли порядок группировки синхронизироваться со входом? Не могли бы вы немного рассказать об этой концепции?
  • 1
    @MantoshKumar Да, поля во входных данных всегда должны быть в указанном порядке. Кроме того, вы можете изменить захват цифр на (\d{1,2}) чтобы иметь дело с датами и временем, состоящими из одной цифры (например, если это первое число месяца и ваш ввод не заполнен нулями).
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню