繁体   English   中英

使用boost正则表达式解析文本文件

[英]parsing text files using boost regular expressions

我正在尝试使用boost::regex库在C ++中解析文本文件。

我正在尝试将这一行解析为我的程序:1_3,1,3,0

  • 1_3需要成为字符串中的名称
  • 1需要成为char中的X坐标
  • 3需要成为char中的Y坐标
  • 0,需要成为一个函数的成本,也是一个char

你们知道写什么匹配吗?

我试过这个,但它不起作用:

boost::regex rgex("^([0-9]),([0-9]+),([0-9]+),([0-9]+).*");

提前致谢

我不会使用正则表达式,这使您不得不进行所有类型的转换。

我将直接解析为结构的vector<>

struct record {
    std::string name;
    char x, y, cost;
};

和Boost Spirit一样

std::vector<record> data;
bool ok = qi::phrase_parse(f, l,
    (qi::lexeme[+~qi::char_(',')] >> ',' >> qi::int_ >> ',' >> qi::int_ >> ',' >> qi::int_) % qi::eol,
    qi::blank,
    data);

if (ok)
{
    std::cout << "Parsed success: " << data.size() << " records\n";
    for(auto& r : data)
        std::cout << r << "\n";
}

请注意,此方法接受并忽略额外的空格( qi::blank )。

看到Live On Coliru打印:

Parsed success: 11 records
1_3 1   3   0
16_92   16  92  76
8_31    8   31  13
3_45    3   45  46
12_67   12  67  66
17_27   17  27  2
7_72    7   72  74
0_36    0   36  25
18_30   18  30  50
6_35    6   35  19
16_5    16  5   50

完整代码

以供参考

#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

struct record {
    std::string name;
    char x, y, cost;

    friend std::ostream& operator<<(std::ostream& os,const record& r) {
        return os << r.name << "\t" << int(r.x) << "\t" << int(r.y) << "\t" << int(r.cost);
    }
};

BOOST_FUSION_ADAPT_STRUCT(record, (std::string, name)(char, x)(char, y)(char, cost))

int main()
{
    std::istringstream iss(
            "1_3,1,3,0\n"
            "16_92,16,92,76\n"
            "8_31,8,31,13\n"
            "3_45,3,45,46\n"
            "12_67,12,67,66\n"
            "17_27,17,27,2\n"
            "7_72,7,72,74\n"
            "0_36,0,36,25\n"
            "18_30,18,30,50\n"
            "6_35,6,35,19\n"
            "16_5,16,5,50"
        );

    boost::spirit::istream_iterator f(iss >> std::noskipws), l;

    std::vector<record> data;
    bool ok = qi::phrase_parse(f, l,
        (qi::lexeme[+~qi::char_(',')]
         >> ',' >> qi::int_ >> ',' >> qi::int_ >> ',' >> qi::int_
        ) % qi::eol,
        qi::blank,
        data);

    if (ok)
    {
        std::cout << "Parsed success: " << data.size() << " records\n";
        for(auto& r : data)
            std::cout << r << "\n";
    } else
    {
        std::cout << "Parse failed\n";
    }

    if (f!=l)
    {
        std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'\n";
    }
}

在不知道所有可接受的字符的情况下,解析该行的最简单方法是用逗号分隔。

"^([^,]+),([^,]+),([^,]+),(.+)$"

[^,]表示任何非逗号字符。 [^,]+表示1个或多个非逗号字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM