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

Несохраняющие скобки в регулярных выражениях в 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" не получить по номеру один.

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