Rust正则表达式模式-无法识别的转义模式

时间:2019-01-06 11:33:49

标签: regex rust

我确实有以下字符串:

\"lengthSeconds\":\"2664\"

我想与此正则表达式匹配:

Regex::new("lengthSeconds\\\":\\\"(\\d+)\\\"")

我什至尝试过:

Regex::new(r#"lengthSeconds\":\"(\d+)\""#)

但是我得到了:

regex parse error:
lengthSeconds\":\"(\d+)\"
             ^^
error: unrecognized escape sequence

正则表达式模式有什么问题?

3 个答案:

答案 0 :(得分:3)

您只需要在正则表达式中转义\,然后可以使用原始字符串。

r#"\\"lengthSeconds\\":\\"2664\\""#是与\"lengthSeconds\":\"2664\"匹配的有效正则表达式

Playground

答案 1 :(得分:3)

您要匹配的字符串是:

\"lengthSeconds\":\"2664\"

要创建与该字符串完全匹配的正则表达式,需要转义所有在正则表达式中具有特殊含义的字符。在这种情况下,仅是反斜杠。正则表达式为:

\\"lengthSeconds\\":\\"2664\\"

要将此正则表达式放入Rust字符串文字中,您需要转义所有在Rust字符串文字中具有特殊含义的字符。在这种情况下,它是引号和反斜杠。因此,字符串文字为:

"\\\\\"lengthSeconds\\\\\":\\\\\"2664\\\\\""

由于很难理解,因此您应该将正则表达式放入原始字符串文字中。为此,您需要转义所有在Rust原始字符串文字中具有特殊含义的字符,幸运的是没有这些字符。因此,原始字符串文字为:

r#"\\"lengthSeconds\\*:\\"2664\\""#

答案 2 :(得分:2)

通过使用r#..#,您会将字符串视为原始字符串,因此不处理任何转义符。但是,由于反斜杠是Regex中的特殊字符,因此Regex表达式本身仍然需要您转义反斜杠。所以

Regex::new(r#"\\"lengthSeconds\\":\\"(\d+)\\""#)

是您想要的。

或者,您可以写

Regex::new("\\\\\"lengthSeconds\\\\\":\\\\\"(\\d+)\\\\\"").unwrap();

产生相同的结果。

查看此example on Rust Playground