Шаблон регулярного выражения Rust - нераспознанный шаблон побега - PullRequest
0 голосов
/ 06 января 2019

У меня есть следующая строка:

\"lengthSeconds\":\"2664\"

, который я хотел бы сопоставить с этим регулярным выражением:

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

Я даже попробовал это:

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

но я получаю это:

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

Что не так с шаблоном регулярных выражений?

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Вам нужно только экранировать \ в регулярном выражении и затем использовать необработанную строку.

r#"\\"lengthSeconds\\":\\"2664\\""# является действительным регулярным выражением, которое соответствует \"lengthSeconds\":\"2664\"

Детская площадка

0 голосов
/ 06 января 2019

Строка, которую вы хотите сопоставить:

\"lengthSeconds\":\"2664\"

Чтобы создать регулярное выражение, точно совпадающее с этой строкой, вам нужно экранировать все символы, которые имеют особое значение в регулярных выражениях. В данном случае это только обратная косая черта. Регулярное выражение:

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

Чтобы поместить это регулярное выражение в строковый литерал Rust, вам нужно экранировать все символы, которые имеют особое значение в строковых литералах Rust. В данном случае это цитата и обратный слеш. Строковый литерал имеет вид:

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

Поскольку это очень трудно читать, вы должны поместить регулярное выражение в необработанный строковый литерал. Для этого вам нужно экранировать все символы, которые имеют особое значение в необработанных строковых литералах Rust, которых, к счастью, нет. Таким образом, необработанный строковый литерал:

r#"\\"lengthSeconds\\*:\\"2664\\""#
0 голосов
/ 06 января 2019

Используя r # .. #, вы обрабатываете вашу строку как необработанную строку и, следовательно, не обрабатываете экранирование. Однако, поскольку обратные слэши в Regex являются специальными символами, само выражение Regex все еще требует от вас экранирования от обратной косой черты. Так что это

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

это то, что вы хотите.

В качестве альтернативы вы можете написать

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

для получения того же результата.

Смотрите этот пример на Rust Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...