我有一串车号,例如kz083y68
,我想将其转换为带有空格的kz 083 y 68
。字符串也可以是3486nv09
等,因此没有固定的分割位置。我需要的只是用空格分割数字和字母的子序列。
显然这可以手动完成,但我想知道 range-v3 库中是否有一个函数可以实现此目的。一般来说,也许有一个函数接受一些谓词(isdigit
、iseven
、isdog
)并将给定范围拆分为相应的子范围? p>
最佳答案
使用views::chunk_by
获取一组 subview :
#include <cctype>
#include <fmt/ranges.h>
#include <ranges>
#include <string>
int main() {
std::string_view plate_code{"kz083y68"};
auto views = plate_code |
std::views::chunk_by([](auto lhs, auto rhs) {
// Thanks @Jarod42 for the simplified predicate!
return std::isdigit(lhs) == std::isdigit(rhs);
});
for (auto const view : views) {
fmt::print("{}", view);
} // ['k', 'z']['0', '8', '3']['y']['6', '8']
}
DEMO .
您可以使用 views::join_with
获取带有选定分隔符的单个 View :
int main() {
std::string_view plate_code{"kz083y68"};
auto view = plate_code | std::views::chunk_by([](auto lhs, auto rhs) {
return std::isdigit(lhs) == std::isdigit(rhs);
}) |
std::views::join_with(' ');
fmt::print("{}", view);
// ['k', 'z', ' ', '0', '8', '3', ' ', 'y', ' ', '6', '8']
}
DEMO .
关于c++ - 如何使用 range v3 库将字符串拆分为由规则定义的序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76867919/