2011-04-24 5 views
14

Je ne suis pas un expert en rubis et peut-être cela va sembler une question idiote ... mais je suis trop courageux au sujet d'une bizarrerie (je pense) que j'ai trouvé dans RSpec matcher appelé match.ruby ​​rspec et cordes comparaison

Vous savez match prend en entrée une chaîne ou une regex. Exemple:

"test".should match "test" #=> will pass 
"test".should match /test/ #=> will pass 

L'étrange commence lorsque vous insérez des caractères regex spéciaux dans la chaîne d'entrée:

"*test*".should match "*test*" #=> will fail throwing a regex exception 

Ce moyen (je pensais) que les chaînes d'entrée sont interprétées comme regex, alors j'échapper regex spéciale caractères pour faire cela fonctionne:

"*test*".should match "\*test\*" #=> will fail with same exception 
"*test*".should match /\*test\*/ #=> will pass 

A partir de ce test de base, je comprends que match traite les chaînes d'entrée comme des expressions régulières, mais elle ne présente pas vous permet d'échapper des caractères spéciaux regex.

Suis-je vrai? N'est-ce pas un comportement singulier? Je veux dire, c'est une chaîne ou une regex!


EDIT APRÈS RÉPONSE:

Après DigitalRoss (à droite) répondre aux critères suivants passé:

"*test*".should match "\\*test\\*" #=> pass 
"*test*".should match '\*test\*' #=> pass 
"*test*".should match /\*test\*/ #=> pass 

Répondre

10

Ce que vous voyez est l'interprétation différente des caractères échappés backslash en chaîne vs Regexp . Dans un doux (") chaîne entre guillemets, \* devient un *, mais /\*/ est vraiment un antislash suivi d'une étoile.

Si vous utilisez des guillemets durs (') pour les objets à cordes ou double des caractères backslash (seulement

+0

Merci d'avoir édité cette question avec les tests de code que vous avez mentionnés –

+1

Vous pouvez également échapper aux expressions regexp, par exemple % r {\\ * test \\ *} Pas si utile avec cela parce que vous avez toujours besoin de barres obliques inverses, mais l'a trouvé inestimable lors de la recherche de/ – Ghoti

+0

légèrement liée , mais j'ai rencontré un problème similaire - le mien concernait les comparaisons de chaînes contenant des caractères échappés, par exemple \ nsome text \ n '. corrigé à l'aide de guillemets doubles pour empêcher l'échappement double de rspec. – lfender6445