Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpRgGL 169 of 288 menu
◀ ▶

Жадность в регулярных выражениях в 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".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить