如何在使用Rust的正则表达式包时逃脱转义的正则表达式字符?

问题描述 投票:1回答:1

我有一个正则表达式,有许多"\逃脱字符。我测试了我的正则表达式,你可以找到my working live demo。我将正则表达式转移到了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]);
    }
}

Playground

我的例子的输出是空的,但我期待PROPFIND

正则表达式文档向我指出了raw string文档。我玩弄了不同的逃避技术,但无法弄清楚我搞砸了哪里。

regex rust escaping
1个回答
1
投票

您的原始模式需要写为

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 raw string literals reference

原始字符串文字不处理任何转义。他们从角色U+0072r)开始,然后是零个或多个角色U+0023#)和U+0022(双引号)角色。原始字符串体可以包含任何Unicode字符序列,并且仅由另一个U+0022(双引号)字符终止,后跟在开头U+0023(双引号)字符之前的相同数量的#U+0022)字符。

© www.soinside.com 2019 - 2024. All rights reserved.