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

cre*_*lem 6 regex escaping rust

我有一个包含许多转义字符的正"则表达式\。我总体测试了我的正则表达式,您可以找到我的工作现场演示。我将正则表达式转移到 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

我的示例的输出是空的,但我期望PROPFIND

正则表达式文档向我指出了原始字符串文档。我尝试了不同的逃避技术,但不知道我哪里搞砸了。

Wik*_*żew 10

你的原始模式需要写成

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();
Run Code Online (Sandbox Code Playgroud)

当前的为:

let re = Regex::new(r#"123 "(\w+)""#).unwrap();
Run Code Online (Sandbox Code Playgroud)

简而言之,\\""您的模式中的所有内容都应该看起来像". 并确保图案位于r#"和内部"#

请参阅Rust 原始字符串文字参考

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