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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在使用Rust的正则表达式包时逃脱转义的正则表达式字符?相关的知识,希望对你有一定的参考价值。

我有一个正则表达式,有许多"逃脱字符。我测试了我的正则表达式,你可以找到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文档。我玩弄了不同的逃避技术,但无法弄清楚我搞砸了哪里。

答案

您的原始模式需要写为

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)字符。

以上是关于如何在使用Rust的正则表达式包时逃脱转义的正则表达式字符?的主要内容,如果未能解决你的问题,请参考以下文章

带有转义引号的引用字符串的正则表达式

正则表达式如何匹配+号?

在coffeescript正则表达式中应该如何转义双引号?

使用正则表达式查找 C# 样式的未转义字符串

了解下C# 正则表达式

如何转义字符串以在 Boost Regex 中使用