Группирующие скобки в регулярках в Rust
Круглые скобки склеивают несколько знаков в один кусок. Квантификатор после закрывающей скобки относится ко всему куску, а не к последнему символу внутри.
Так же скобки открывают карман: найденный фрагмент можно будет достать по номеру позже. Сейчас нас интересует только группировка для повтора:
use regex::Regex;
fn main() {
let re = Regex::new(r"(ab)+").expect("bad pattern");
let out = re.replace_all("ab abab xab", "!");
println!("{}", out);
}
Шаблон ищет одну или несколько пар
"ab" подряд. Без скобок плюс
относился бы только к букве "b".
Вложенные скобки тоже группируют, но номера карманов считают по порядку открытия. Для замены всего блока достаточно внешней пары:
use regex::Regex;
fn main() {
let re = Regex::new(r"(x(y)+)").expect("bad pattern");
let out = re.replace_all("xyy xyyy", "*");
println!("{}", out);
}
Дана строка:
let line = "ha haha hahaha";
Сгрупируйте "ha" и замените каждую
цепочку из двух и более таких кусков
на "!".
Дана строка:
let line = "101 10101 1010101";
Найдите повторяющийся блок "10"
один или более раз и замените его на
"X".
Объясните, чем отличается шаблон
ab+ от (ab)+ на строке
"aab ab" при замене на звездочку.