= "dir a\n14848514 b.txt\n8504156 c.dat\ndir d";
let mut nums = vec!();
let mut start = 0usize;
let mut in_num = false;
for (i, c) in x.chars().enumerate() {
if c.is_ascii_digit() {
if !in_num {
in_num = true;
start = i;
}
} else {
if in_num {
nums.push(&x[start..i]);
in_num = false;
}
}
}
println!("{:?}", nums);
но эт нужно смотреть в годболте и бенчмарками
Можно же просто сплитнуть по нецифрам и потом пофильтровать, чтоб непустые строки были (если в расширениях цифр не будет)
сплит это 1 итерация фильтр еще одна потом ещё собрать это
кинь код, попробую в бенч закинуть
str.split(|c: char| !c.is_ascii_digit()).filter(|s| !s.is_empty()) Вроде
test tests::bench_f1 ... bench: 85 ns/iter (+/- 2) test tests::bench_f2 ... bench: 58 ns/iter (+/- 4) f1 твой вариант, f2 мой
Кстати оно сфейлит ещё, если будет просто число в конце, после итерации нужно проверить, что in_num задан
Там и с utf8 будут проблемы. Я саму идею передать. А так там нужно не chars, а bytes и проверки корнер кейсов
Обсуждают сегодня