regex_iterator和regex_token_iterator有什么区别?

r7xajy2e  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(103)

看看regex_iteratorregex_token_iterator,我发现关键的区别在于value_type,它是:

  • match_results<BidirIt>用于regex_iterator
  • sub_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>中?

83qze16e

83qze16e1#

  1. std::sregex_token_iterator::operator*()返回对std::sub_match<BidirIt>的引用,这不是std::string
    1.你可以从一个包含两个迭代器的初始化器列表中构造一个向量。调用正确的构造函数需要使用括号。
#include <iostream>
#include <regex>
#include <string>
#include <vector>

int main()
{
    std::string input_str = "hi, world";
    const std::regex  reg_ex(R"(\S+\w+|[,.])");

    std::vector tokens(
        std::sregex_iterator(input_str.begin(), input_str.end(), reg_ex), 
        std::sregex_iterator() 
    );

    for (const auto& item : tokens)
    {
        std::cout << item.str() << std::endl;
    }
}

字符串

相关问题