regex_iterator не соответствует группам в регулярном выражении - PullRequest
0 голосов
/ 30 мая 2018

Как извлечь Test и Again из строки s в коде ниже .В настоящее время я использую regex_iterator, и он не соответствует группам в регулярном выражении, и я получаю {{Test}} и {{Again}} в выходных данных.

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "<abc>{{Test}}</abc><def>{{Again}}</def>";
    std::regex rgx("\\{\\{(\\w+)\\}\\}");
    std::smatch match;
    std::sregex_iterator next(s.begin(), s.end(), rgx);
    std::sregex_iterator end;
    while (next != end) {
      std::smatch match = *next;
      std::cout << match.str() << "\n";
      next++;
    } 
    return 0;
}

Я также пытался использовать regex_searchно он не работает с несколькими шаблонами и дает только Test ouput

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "<abc>{{Test}}</abc><def>{{Again}}</def>";
    std::regex rgx("\\{\\{(\\w+)\\}\\}");
    std::smatch match;

    if (std::regex_search(s, match, rgx,std::regex_constants::match_any))
    {
        std::cout<<"Match size is "<<match.size()<<std::endl;
        for(auto elem:match)
        std::cout << "match: " << elem << '\n';
    }
}

Также в качестве примечания, почему для удаления {или}

необходимы две обратные косые черты

1 Ответ

0 голосов
/ 30 мая 2018

Для доступа к содержимому группы захвата вам нужно использовать .str(1):

std::cout << match.str(1) << std::endl;

См. Демонстрацию C ++ :

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "<abc>{{Test}}</abc><def>{{Again}}</def>";
    // std::regex rgx("\\{\\{(\\w+)\\}\\}");
    // Better, use a raw string literal:
    std::regex rgx(R"(\{\{(\w+)\}\})");
    std::smatch match;
    std::sregex_iterator next(s.begin(), s.end(), rgx);
    std::sregex_iterator end;
    while (next != end) {
      std::smatch match = *next;
      std::cout << match.str(1) << std::endl;
      next++;
    } 
    return 0;
}

Вывод:

Test
Again

Обратите внимание, что вам не нужно использовать двойную обратную косую черту для определения escape-последовательности регулярного выражения внутри raw строковых литералов (здесь R"(pattern_here)").

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