提升正则表达式的困难

时间:2011-12-03 22:35:57

标签: regex boost

我正在尝试使用boost解析一些文本。我查看了官方网站上的example,但它似乎没有用。我写了自己的例子;它根本不进入while循环。

#include <boost/regex.hpp>
using namespace std;

int main(void)
{
    string s;
    string::const_iterator st, en;
    s = "int_node:0 int_node:1 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:2 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:3 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:4 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:5 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:6 link_latency:1 bw_multiplier:16 link_weight:1\n"
       "int_node:0 int_node:7 link_latency:1 bw_multiplier:16 link_weight:1";

    st = s.begin();
    en = s.end();
    boost::regex expression("int_node:([0-9]+) int_node:([0-9]+)"
                            " link_latency:([0-9]+) bw_multiplier:([0-9]+)"
                            " link_weight:([0-9]+) long_range:([0-9]+)"
                        " no_of_vcs:([0-9]+)");

    boost::match_results<std::string::const_iterator> what;


    boost::match_flag_type flags = boost::match_default;

    while(boost::regex_search(st, en, what, expression, flags))
    {
      st = what[0].second;
          flags |= boost::match_prev_avail;
          flags |= boost::match_not_bob;

      cout << what[1] << " " << what[2] << " " << what[3] << "\n";
    }

    return 0;
}

我正在尝试解析一个看起来像这样的文件:

int_node:0 int_node:1 link_latency:1 bw_multiplier:16 link_weight:1
int_node:0 int_node:2 link_latency:1 bw_multiplier:16 link_weight:1
int_node:0 int_node:3 link_latency:1 bw_multiplier:16 link_weight:1
int_node:0 int_node:4 link_latency:1 bw_multiplier:16 link_weight:1

并检索每个字段的整数值。

2 个答案:

答案 0 :(得分:0)

您的正则表达式还有两个字段,而不是字符串:long_rangeno_of_vcs。由于这些不在字符串中,因此正则表达式与字符串不匹配。

顺便说一句,我编辑了你的问题,将字符串分成几行。在C ++中,连接相邻的字符串文字:"a" "b"等同于"ab"。通过使用此语法,从而消除水平滚动,更容易看到发生了什么。我很确定你会注意到这种差异,如果你以这种方式开始写它。

答案 1 :(得分:0)

您的正则表达式有7个元素,但您搜索的每行只有5个。

您可以尝试以下两个选项之一。要么将元素数量减少到5

    boost::regex expression("int_node:([0-9]+) int_node:([0-9]+) link_latency:([0-9]+) bw_multiplier:([0-9]+) link_weight:([0-9]+)");

或者,如果某些行可能包含最后两个元素(并且您想引用它们),请使用这样的正向前瞻断言:

    boost::regex expression("int_node:([0-9]+) int_node:([0-9]+) link_latency:([0-9]+) bw_multiplier:([0-9]+) link_weight:([0-9]+)(?= long_range:([0-9]+) no_of_vcs:([0-9]+))?");

如果您不熟悉正则表达式,(?:REGEX)?会说最后两个元素是可选的,而开头的?:表示此特定分组不计算在内。如果第6列(long_range)中有值,则what[6]将包含long_range值,否则将为空。