Несохраняющие скобки в регулярных выражениях в Rust
Запись (?:...) группирует кусок
для квантификатора или для альтернативы,
но не создает карман. Номера у следующих
групп не сдвигаются из-за лишней пары.
Сравним обычные скобки и несохраняющие при чтении карманов:
use regex::Regex;
fn main() {
let cap = Regex::new(r"(ab)(cd)").expect("bad pattern");
let nc = Regex::new(r"(?:ab)(cd)").expect("bad pattern");
let line = "abcd";
if let Some(c1) = cap.captures(line) {
if let Some(g) = c1.get(1) {
println!("{}", g.as_str());
}
}
if let Some(c2) = nc.captures(line) {
if let Some(g) = c2.get(1) {
println!("{}", g.as_str());
}
}
}
Несохраняющая группа удобна, когда нужны скобки только для повтора, а в замене важен один карман:
use regex::Regex;
fn main() {
let re = Regex::new(r"(?:https?://)(\w+)").expect("bad pattern");
let line = "see http://site and https://other";
let out = re.replace_all(line, "[$1]");
println!("{}", out);
}
Дана строка:
let line = "x12y34";
Снимите числа карманом один, а букву
"x" оставьте в несохраняющей группе
перед цифрами.
Объясните, почему в шаблоне с
(?:ab)+ карман "ab" не
получить по номеру один.