是否有一种直接有效的方法将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的对象,序列的第一个元素位于零。这样可以使用charconv
的std::from_chars
(令人惊讶的是,使用ForwardIterator
s无法实现)。 std::sub_match
似乎不是这种情况,因为它表示为一对BidirectionalIterator
s。std::basic_string_view
有一个更丰富的类似字符串的界面,可以在某些特殊情况下为某些文件格式提供额外的上下文相关标记化。答案 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
的剩余命名特化是留给读者的练习。