迭代表示为std :: basic_string_view的正则表达式子匹配

时间:2018-06-04 08:13:00

标签: c++ c++17 tokenize

是否有一种直接有效的方法将std::sub_match转换为std::basic_string_view(不构建中间std::basic_string且没有中间堆分配)?或者进一步的一个抽象级别,是否有std::regex_token_iterator替代使用std(C ++ 17)迭代表示为std::basic_string_view而不是std::sub_match的正则表达式子匹配?

我更喜欢使用std::basic_string_view而不是std::sub_match的原因是:

  • std::basic_string_view指的是一个恒定的连续序列的类似char的对象,序列的第一个元素位于零。这样可以使用charconvstd::from_chars(令人惊讶的是,使用ForwardIterator s无法实现)。 std::sub_match似乎不是这种情况,因为它表示为一对BidirectionalIterator s。
  • std::basic_string_view有一个更丰富的类似字符串的界面,可以在某些特殊情况下为某些文件格式提供额外的上下文相关标记化。

1 个答案:

答案 0 :(得分:3)

没有通用的方法来检测迭代器是否是连续的。我们仍然可以处理已知的连续迭代器 - 例如std::string

的迭代器
std::string_view as_sv(std::ssub_match m) {
    if(!m.matched) return {};
    return { &*m.first, m.second - m.first };
}

处理sub_match的剩余命名特化是留给读者的练习。