Жадность в регулярных выражениях в Rust
По умолчанию квантификатор жадный: он тянет повторяемый кусок как можно дальше, пока весь шаблон еще может совпасть. Иногда из-за этого в совпадение попадает лишний текст.
Вопрос сразу после квантификатора делает его ленивым: повтор берет минимум, при котором остальная часть шаблона еще выполняется:
use regex::Regex;
fn main() {
let greedy = Regex::new(r"<.+>").expect("bad pattern");
let lazy = Regex::new(r"<.+?>").expect("bad pattern");
let line = "<b>one</b> <i>two</i>";
println!("{}", greedy.replace(line, "!"));
println!("{}", lazy.replace(line, "!"));
}
Ленивость работает и с другими квантификаторами: запись *?, +? или {2,5}? ограничивает жадность для звезды, плюса и фигурных скобок:
use regex::Regex;
fn main() {
let re = Regex::new(r#"".*?""#).expect("bad pattern");
let line = "say \"hi\" and \"bye\"";
if let Some(m) = re.find(line) {
println!("{}", m.as_str());
}
}
Дана строка:
let line = "<tag>inner</tag> tail";
Сравните жадный и ленивый вариант шаблона
для содержимого между "<" и
">" и скажите, какой оставит
" tail" снаружи замены.
Дана строка:
let line = "aaaaba";
Подберите ленивый шаблон a+?b
и объясните, где остановится повтор
буквы "a".