我有一个正则表达式,其中有许多"
和\
转义字符。我总体上测试了我的正则表达式,您可以找到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]);
}
}
我的示例的输出为空,但是我希望PROPFIND
正则表达式文档向我介绍了raw string文档。我玩了各种各样的转义技术,但不知道自己搞砸了。
答案 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+0072
(r
)开头,然后是零个或多个字符U+0023
(#
)和U+0022
(双引号)字符。 原始字符串正文可以包含任何Unicode字符序列,并且仅以另一个U+0022
(双引号)字符结尾,后跟相同数量的U+0023
({{ 1}})字符放在开头#
(双引号)之前。