Карманы в регулярных выражениях в Rust
Когда шаблон содержит группы в круглых скобках, поиск с карманами возвращает не только весь фрагмент, но и части по номерам. Нулевой карман - все совпадение целиком.
Достанем день, месяц и год из записи через три группы:
use regex::Regex;
fn main() {
let re = Regex::new(r"(\d{2})\.(\d{2})\.(\d{4})").expect("bad pattern");
let line = "date 31.12.2024 end";
if let Some(cap) = re.captures(line) {
if let Some(d) = cap.get(1) {
println!("{}", d.as_str());
}
if let Some(m) = cap.get(2) {
println!("{}", m.as_str());
}
if let Some(y) = cap.get(3) {
println!("{}", y.as_str());
}
}
}
Если группа не участвовала в совпадении, запрос по ее номеру вернет пустой вариант. Проверяйте наличие перед чтением текста:
use regex::Regex;
fn main() {
let re = Regex::new(r"(a)(b)?").expect("bad pattern");
let line = "a";
if let Some(cap) = re.captures(line) {
println!("{}", cap.get(2).is_none());
}
}
Дана строка:
let line = "user:Ann score:9";
Выделите имя после "user:" и число
после "score:" в отдельные карманы
и выведите оба.
Дана строка:
let line = "ab";
Скажите, что лежит в кармане ноль для шаблона с двумя группами по одной букве.