我确实有以下字符串:
\"lengthSeconds\":\"2664\"
我想与此正则表达式匹配:
Regex::new("lengthSeconds\\\":\\\"(\\d+)\\\"")
我什至尝试过:
Regex::new(r#"lengthSeconds\":\"(\d+)\""#)
但是我得到了:
regex parse error:
lengthSeconds\":\"(\d+)\"
^^
error: unrecognized escape sequence
正则表达式模式有什么问题?
答案 0 :(得分:3)
您只需要在正则表达式中转义\
,然后可以使用原始字符串。
r#"\\"lengthSeconds\\":\\"2664\\""#
是与\"lengthSeconds\":\"2664\"
匹配的有效正则表达式
答案 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();
产生相同的结果。