Reputation: 4397
I do have following string:
\"lengthSeconds\":\"2664\"
which I would like to match with this regexp:
Regex::new("lengthSeconds\\\":\\\"(\\d+)\\\"")
I even tried this:
Regex::new(r#"lengthSeconds\":\"(\d+)\""#)
but I'm getting this:
regex parse error:
lengthSeconds\":\"(\d+)\"
^^
error: unrecognized escape sequence
What's wrong with the regexp pattern?
Upvotes: 6
Views: 7660
Reputation: 1311
By using r#..#, you treat your string as a raw string and hence do not process any escapes. However, since backslashes are special characters in Regex, the Regex expression itself still requires you to escape backslashes. So this
Regex::new(r#"\\"lengthSeconds\\":\\"(\d+)\\""#)
is what you want.
Alternatively, you could write
Regex::new("\\\\\"lengthSeconds\\\\\":\\\\\"(\\d+)\\\\\"").unwrap();
to yield the same result.
See this example on Rust Playground
Upvotes: 7
Reputation: 41686
The string you want to match is:
\"lengthSeconds\":\"2664\"
To make a regular expression that matches exactly this string, you need to escape all characters that have a special meaning in regexes. In this case, it is only the backslash. The regular expression is:
\\"lengthSeconds\\":\\"2664\\"
To put this regular expressing into a Rust string literal, you need to escape all characters that have a special meaning in Rust string literals. In this case, it's the quote and the backslash. The string literal is thus:
"\\\\\"lengthSeconds\\\\\":\\\\\"2664\\\\\""
Since this is very hard to read, you should rather put the regex into a raw string literal. For this you need to escape all characters that have a special meaning in Rust raw string literals, which luckily are none. The raw string literal is thus:
r#"\\"lengthSeconds\\*:\\"2664\\""#
Upvotes: 3
Reputation: 2535
You only need to escape the \
in the regex and can then use a raw string.
r#"\\"lengthSeconds\\":\\"2664\\""#
is a valid regex which matches \"lengthSeconds\":\"2664\"
Upvotes: 3