ruby rspec et les chaînes de caractères comparaison
Je ne suis pas un expert ruby et peut-être cela va sembler une question stupide...mais je suis trop courious sur une curiosité (je pense) que j'ai trouvé dans RSpec matcher " match.
Vous savez match
prend en entrée une chaîne de caractères ou une expression régulière. Exemple:
"test".should match "test" #=> will pass
"test".should match /test/ #=> will pass
L'étrange commence lorsque vous insérez spécial de la regex de caractères dans la chaîne d'entrée:
"*test*".should match "*test*" #=> will fail throwing a regex exception
Cela signifie (je pense) que les chaînes de caractères sont interprétés comme des regex, je dois l'échappement de regex personnages pour en faire des œuvres:
"*test*".should match "\*test\*" #=> will fail with same exception
"*test*".should match /\*test\*/ #=> will pass
À partir de cette base de test, je comprends que match
traite les chaînes d'entrée comme des expressions régulières, mais il ne vous permet pas d'échapper regex caractères.
Suis-je fidèle? N'est-ce pas un comportement singulier? Je veux dire, c'est une chaîne ou une expression régulière regex!
MODIFIER APRÈS LA RÉPONSE:
Suivantes DigitalRoss (à droite) répondez à la suite de tests passés:
"*test*".should match "\\*test\\*" #=> pass
"*test*".should match '\*test\*' #=> pass
"*test*".should match /\*test\*/ #=> pass
OriginalL'auteur Emiliano Poggi | 2011-04-24
Vous devez vous connecter pour publier un commentaire.
Ce que vous voyez est l'interprétation différente de l'anti-slash-des caractères d'échappement dans le String vs Regexp. Dans un soft (") chaîne de caractères entre guillemets,
\*
devient un*
, mais/\*/
est vraiment un antislash suivi d'une étoile.Si vous utilisez des guillemets ( " ) pour les objets String ou le double de la barre oblique inverse (uniquement pour les Chaînes, tout de même) alors vos tests devraient produire les mêmes résultats.
Vous pouvez également échapper à la regexp comme des cordes, par exemple %de r{\*test\*} Pas si utile avec ce parce que vous avez encore besoin de barres obliques inverses, mais il lui est précieuse lors de l'appariement pour /
légèrement liée, mais j'ai rencontré un problème similaire - la mienne était autour de comparaisons de chaînes contenant des caractères d'échappement, `\nsome texte\n", par exemple. fixé à l'aide de guillemets pour empêcher rspec de double échappement.
OriginalL'auteur DigitalRoss