使用Rust的正则表达式板条箱时,如何转义转义的正则表达式字符?

时间:2019-02-27 19:20:22

标签: regex rust escaping

我有一个正则表达式,其中有许多"\转义字符。我总体上测试了我的正则表达式,您可以找到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文档。我玩了各种各样的转义技术,但不知道自己搞砸了。

1 个答案:

答案 0 :(得分: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({{ 1}})字符放在开头#(双引号)之前。