繁体   English   中英

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

[英]Iterating regex submatches represented as std::basic_string_view

是否有直接有效的方法将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::sub_match上使用std::basic_string_view的原因是:

  • std::basic_string_view指的是char型对象的恒定连续序列,该序列的第一个元素位于位置0。 这将启用charconvstd::from_chars (令人惊讶的是,它没有使用ForwardIterator实现)。 std::sub_match似乎不是这种情况,因为它表示为一对BidirectionalIterator
  • std::basic_string_view具有更丰富的类似于字符串的界面,在某些特殊情况下,对于某些文件格式,它可以促进附加的上下文相关的标记化。

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

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

处理sub_match的其余命名专业化作为练习留给读者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM