如何在使用Rust';什么是regex板条箱?

如何在使用Rust';什么是regex板条箱?,regex,rust,escaping,Regex,Rust,Escaping,我有一个正则表达式,它有许多转义字符。和\我测试了我的正则表达式,你可以找到。我将正则表达式转换为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_ite

我有一个正则表达式,它有许多转义字符。和
\
我测试了我的正则表达式,你可以找到。我将正则表达式转换为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文档向我指出了文档。我使用了不同的转义技术,但不知道哪里出了问题。

您的原始模式需要按照

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#“
”#

请参阅:

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


当您将正则表达式简化为只测试一件事情时会发生什么情况,例如IP地址或任何其他一件事情?请参阅。感谢您的提示,我将尝试逐个匹配以跟踪问题。您不需要在原始字符串中转义引号,请使用如下输入:注意
(HTTP | HTTPS)
=
(HTTPS?)
在模式中,必须对数字之间的点进行转义,以匹配文字点。@WiktorStribiżew感谢您的提示。我的问题通常是我不明白我还必须删除常规的正则转义。但现在我明白了。非常感谢。@createproblem
\w
是正则表达式转义,您不应该删除它。双引号不是特殊的,不应该用正则表达式转义。另外,您实际上将模式中的双引号加倍,因此它不可能找到匹配项。