如何匹配以'开头的十进制数字!'在C ++中

时间:2017-11-17 16:24:26

标签: c++ regex

如何匹配以"!"开头的所有十进制数字? (bang)在给定的字符串中?我编写了以下代码,但它失败并带有断言

#include<iostream>
#include<regex>

int main()
{
    std::string s1("{!112,2,3}");
    std::regex e(R"(\!\d+)", std::regex::grep);

    std::cout << s1 << std::endl;

    std::sregex_iterator iter(s1.begin(), s1.end(), e);
    std::sregex_iterator end;

    while(iter != end)
    {
        std::cout << "size: " << iter->size() << std::endl;

        for(unsigned i = 0; i < iter->size(); ++i)
        {
            std::cout << "the " << i + 1 << "th match" << ": " << (*iter)[i] << std::endl;
        }
        ++iter;
    }
}

断言

terminate called after throwing an instance of 'std::regex_error'
  what():  regex_error
Aborted (core dumped)

1 个答案:

答案 0 :(得分:2)

首先,确保您使用的是最新的GCC编译器。

然后使用与感叹号匹配的R"(!(\d+))"模式,然后捕获Iinto Group 1中的一个或多个数字。

然后在迭代匹配时抓住保存您的值的(*iter)[1]

请参阅C++ demo

#include<iostream>
#include<regex>
int main() {
   std::string s1("{!112,2,3} {!346,765,8}"); 
   std::regex e(R"(!(\d+))"); 
   std::cout << s1 << std::endl; 
   std::sregex_iterator iter(s1.begin(), s1.end(), e); std::sregex_iterator end;   
   while(iter != end) { 
       std::cout << "Value: " << (*iter)[1] << std::endl; 
       ++iter; 
    }
}

输出:

{!112,2,3} {!346,765,8} 
Value: 112
Value: 346