看看regex_iterator和regex_token_iterator,我发现关键的区别在于value_type
,它是:
match_results<BidirIt>
用于regex_iteratorsub_match<BidirIt>
用于regex_token_iterator
同时,它们的示例(在这些页面上)显示了相反的行为:
regex_iterator
根据regex中标记本身的定义进行拆分regex_token_iterator
通过regex中的分隔符描述进行拆分
尽管在上述文献中没有具体说明。
在What is the difference between regex_token_iterator and regex_iterator?中,指定了regex_token_iterator可以有最后一个参数-1,0或1,但我在regex_token_iterator中找不到这个参数。这是我想的一种常识还是文件想这个?
我的具体问题是是什么让它们如此不同
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string input_str = "hi, world";
const std::regex reg_ex(R"(\S+\w+|[,.])");
std::vector<std::string> tokens {
std::sregex_token_iterator(input_str.begin(), input_str.end(), reg_ex, 0),
std::sregex_token_iterator()
};
for (auto& item : tokens)
{
std::cout << item << std::endl;
}
}
字符串
编译和工作没有任何问题,并且基于sregex_iterator
的相同代码不会编译许多错误消息,这些错误消息隐藏了有关真实的问题的信息。实际上,它不能从迭代器生成vector<string>
。
参见demo with the issue。
有没有什么方法可以像处理sregex_token_iterator
的结果一样处理regex_iterator的结果,并像上面的例子一样直接将它们打包到vector<string>
中?
1条答案
按热度按时间83qze16e1#
std::sregex_token_iterator::operator*()
返回对std::sub_match<BidirIt>
的引用,这不是std::string
。1.你可以从一个包含两个迭代器的初始化器列表中构造一个向量。调用正确的构造函数需要使用括号。
字符串