Ограничения движка regex в Rust
Движок крейта regex рассчитан на быстрый линейный поиск. Ради этого в нем нет некоторых приемов, которые встречаются в других языках: просмотр вперед и назад, а также повтор, который ссылается на текст уже найденной группы.
Шаблон с просмотром вперед не собирается и завершится с ошибкой при создании объекта:
use regex::Regex;
fn main() {
let re = Regex::new(r"aaa(?=x)").expect("bad pattern");
let _ = re;
}
Обратная ссылка на номер кармана тоже не поддерживается. Такой текст шаблона не пройдет проверку при сборке:
use regex::Regex;
fn main() {
let re = Regex::new(r"(\w+)\s+\1").expect("bad pattern");
let _ = re;
}
Задачи, где в других языках просят совпадение только если дальше идет такой-то символ, но не включая его, здесь решают иначе: отдельным шаблоном, разбиением строки или обычным кодом вокруг совпадения.
Попробуйте собрать шаблон с негативным просмотром назад и опишите, на каком шаге программа сообщит о bad pattern.
Объясните, почему шаблон с повтором той же группы не подходит для поиска удвоенных слов подряд в этом крейте.