我正在尝试使用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
并检索每个字段的整数值。
答案 0 :(得分:0)
您的正则表达式还有两个字段,而不是字符串:long_range
和no_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值,否则将为空。