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

Iterating regex submatches represented as std::basic_string_view

本文关键字:正则表达式 view string std 表示 basic 迭代      更新时间:2023-10-16

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

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

  • std::basic_string_view是指类字符对象的恒定连续序列,序列的第一个元素位于位置零。这允许使用charconvstd::from_chars(令人惊讶的是,它没有使用ForwardIterators 实现(。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的其余命名专业留给读者作为练习。