3
votes

Modèle de regex de rouille - modèle d'échappement non reconnu

J'ai la chaîne suivante:

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

que je voudrais faire correspondre avec cette expression rationnelle:

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

J'ai même essayé ceci:

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

mais j'obtiens ceci:

\"lengthSeconds\":\"2664\"

Quel est le problème avec le modèle de regexp?

p>


2 commentaires

utilisez r # "\\" lengthSeconds \\ ": \\" 2664 \\ "" #


Pourriez-vous publier un peu plus de code, éventuellement exécutable sur play.rust-lang.org ? (Juste pour nous assurer que nous comprenons ce qui doit réellement être échappé et ce qui ne l'est pas.)


3 Réponses :


5
votes

En utilisant r # .. #, vous traitez votre chaîne comme une chaîne brute et ne traitez donc aucun échappement. Cependant, comme les barres obliques inverses sont des caractères spéciaux dans Regex, l'expression Regex elle-même vous oblige toujours à échapper les barres obliques inverses. Donc ça

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

est ce que vous voulez.

Vous pouvez également écrire

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

pour obtenir le même résultat.

Voir cet exemple sur Rust Playground


4 commentaires

Je vous remercie. Question stupide. Les backslashes sont les seuls dont j'ai besoin pour m'échapper dans les cordons?


Cette réponse est trompeuse. Les backslashes doivent être échappés parce que l'expression régulière l'exige, pas parce que la chaîne brute l'exige.


@RolandIllig Merci pour vos commentaires. J'ai essayé de clarifier cela dans la récente modification.


Votre réponse ne dit toujours pas clairement que les barres obliques inverses sont nécessaires pour l'expression régulière. C'est la source de confusion ici, et votre réponse devrait l'expliquer.



3
votes

Il vous suffit d'échapper le \ dans l'expression régulière et vous pouvez ensuite utiliser une chaîne brute.

r # "\\" lengthSeconds \\ ": \\" 2664 \\ "" # est une expression régulière valide qui correspond à \ "lengthSeconds \": \ "2664 \"

Terrain de jeu


0 commentaires

3
votes

La chaîne que vous voulez faire correspondre est:

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

Pour créer une expression régulière qui correspond exactement à cette chaîne, vous devez échapper tous les caractères qui ont une signification particulière dans les expressions régulières. Dans ce cas, il ne s'agit que de la barre oblique inverse. L'expression régulière est:

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

Pour mettre cette expression régulière dans un littéral de chaîne Rust, vous devez échapper tous les caractères qui ont une signification spéciale dans les littéraux de chaîne Rust. Dans ce cas, il s'agit de la citation et de la barre oblique inverse. Le littéral de chaîne est donc:

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

Comme c'est très difficile à lire, vous devriez plutôt mettre l'expression régulière dans un littéral de chaîne brute. Pour cela, vous devez échapper à tous les caractères qui ont une signification particulière dans les littéraux de chaîne brute Rust, qui heureusement n'en sont aucun. La chaîne littérale brute est donc:

\"lengthSeconds\":\"2664\"


0 commentaires