Как избежать экранированных символов регулярных выражений при использовании корзины регулярных выражений Rust? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть регулярное выражение, в котором содержится много экранированных символов " и \.Я проверил свое регулярное выражение в целом, и вы можете найти мою рабочую живую демонстрацию .Я перенес регулярное выражение в Rust.Вот упрощенный пример, который не работает:

extern crate regex; // 1.1.0
use regex::Regex;

fn main() {
    let re = Regex::new(r#"123 \\""(\w+)"#).unwrap();
    let test = "123 \"PROPFIND\"";

    for cap in re.captures_iter(test) {
        println!("{}", &cap[1]);
    }
}

Детская площадка

Вывод моего примера пуст, но я ожидаю PROPFIND

Документация regex указала мне на документацию raw string .Я играл с различными методами побега, но не могу понять, где я испортил.

1 Ответ

0 голосов
/ 27 февраля 2019

Ваш оригинальный шаблон должен быть записан как

let re = Regex::new(r#"(\d{1,3}(?:\.\d{1,3}){3}) (\w+|-) (\w+|-) \[(.*?)\] "(\w+) (.*?) (HTTPS?)/([0-9]\.[0-9])" ([0-9]+) ([0-9]+) "(\w+|-)" "(.*?)""#).unwrap();

Текущий шаблон:

let re = Regex::new(r#"123 "(\w+)""#).unwrap();

Короче говоря, все \\"" в вашем шаблоне должны выглядеть как ",И убедитесь, что шаблон находится внутри r#" и "#.

Пожалуйста, обратитесь к Ссылка на необработанные строковые литералы Rust :

Необработанные строковые литералы делаютне обрабатывать никаких побегов.Они начинаются с символа U+0072 (r), за которым следует ноль или более символов U+0023 (#) и U+0022 (двойная кавычка). тело необработанной строки может содержать любую последовательность символов Unicode и заканчивается только другим символом U+0022 (двойная кавычка), за которым следует то же количество символов U+0023 (#), которое предшествоваловводный U+0022 (двойная кавычка) символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...