使用c ++中的regex / boost查找2个数字之间的数字

时间:2015-05-21 17:59:41

标签: c++ regex boost

我觉得这是一个非常基本的问题,但我找不到它的帖子。如果您知道,请在下面链接。 所以我要做的是查看一个字符串,并以2为一组提取数字。

这是我的代码:

int main() {
        string line = "P112233";
        boost::regex e ("P([0-9]{2}[0-9]{2}[0-9]{2})");
        boost::smatch match;

        if (boost::regex_search(line, match, e))
        {
            boost::regex f("([0-9]{2})"); //finds 11
            boost::smatch match2;
            line = match[0];
            if (boost::regex_search(line, match2, f))
            {
                float number1 = boost::lexical_cast<float>(match2[0]);
                cout << number1 << endl;  // this works and prints out 11.
            }

            boost::regex g("         "); // here I want it to find the 22
            boost::smatch match3;
            if (boost::regex_search(line, match3, g))
            {
                float number2 = boost::lexical_cast<float>(match3[0]);
                cout << number2 << endl;
            }
            boost::regex h("         "); // here I want it to find the 33
            boost::smatch match4;
            if (boost::regex_search(line, match4, h))
            {
                float number3 = boost::lexical_cast<float>(match4[0]);
                cout << number3 << endl;
            }
        }
        else
            cout << "found nothing"<< endl;
    return 0;
}

我能得到第一个数字,但我不知道如何得到第二个(22)和第三个(33)。 什么是我需要使用的正确表达?

2 个答案:

答案 0 :(得分:2)

正如@Cornstalks所提到的,你需要使用3个捕获组,然后你可以像这样访问它们:

int main() 
{
    std::string line = "P112233";
    boost::regex e("P([0-9]{2})([0-9]{2})([0-9]{2})");
    boost::smatch match;

    if (boost::regex_search(line, match, e))
    {
        std::cout << match[0] << std::endl; // prints the whole string
        std::cout << match[1] << ", " << match[2] << ", " << match[3] << std::endl;
    }

    return 0;
}

输出:

P112233
11, 22, 33

答案 1 :(得分:1)

我不喜欢这种解析的正则表达式。关键的一点是,当你完成那个毛茸茸的正则表达时,数字仍然是字符串。

我在这里使用Boost Spirit,它会同时解析所有数字,你甚至不必链接到Boost Regex库,因为Spirit只是标题。

<强> Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <iostream>

namespace qi = boost::spirit::qi;
static qi::int_parser<int, 10, 2, 2> two_digits;

int main() {
    std::string const s = "P112233";

    std::vector<int> nums;
    if (qi::parse(s.begin(), s.end(), "P" >> *two_digits, nums))
    {
        std::cout << "Parsed " << nums.size() << " pairs of digits:\n";
        for(auto i : nums)
            std::cout << " * " << i << "\n";
    }
}


Parsed 3 pairs of digits:
 * 11
 * 22
 * 33