2011-04-24 19 views
14

No soy un experto en rubí y puede ser que esto parezca una pregunta tonta ... pero soy demasiado cómico sobre una rareza (creo) que he encontrado en RSpec Matcher llamado match.ruby ​​rspec y comparación de cuerdas

Usted sabe match tiene en entrada una cadena o una expresión regular. Ejemplo:

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

La extraña comienza cuando se inserta caracteres de expresiones regulares especiales en la cadena de entrada:

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

Esto significa (pensé) que las cadenas de entrada se interpretan como expresiones regulares, entonces yo debería escapar de expresiones regulares especial personajes que hacen funciona:

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

partir de esta prueba básica, entiendo que match trata a las cadenas de entrada como expresiones regulares pero no lo hace te permite escapar de los caracteres especiales de expresiones regulares.

¿Soy cierto? ¿No es esto un comportamiento singular? Quiero decir, ¡es una cadena o una expresión regular!


Edición después RESPUESTA:

Siguiendo DigitalRoss (derecha) responder a las siguientes pruebas pasaron:

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

Respuesta

10

Lo que está viendo es la diferente interpretación de personajes escapados en Cadena vs Regexp . En un (") cordaje flexible citado, \* se convierte en un *, pero /\*/ es realmente una barra invertida seguida de una estrella.

Si utiliza frases duras (') para la cadena de objetos o el doble de los caracteres de barra invertida (sólo para las cadenas, sin embargo) entonces sus pruebas deberían producir los mismos resultados.

+0

Gracias, tiene usted razón. Edité la pregunta con las pruebas de código que mencionó. –

+1

También puede escapar de expresiones regulares como cadenas, por ejemplo % r {\\ * test \\ *} No es tan útil con esto porque aún necesita barras diagonales inversas, pero es invaluable cuando se combina con/ – Ghoti

+0

levemente relacionado , pero me encontré con un problema similar: el mío estaba en torno a las comparaciones de cadenas que contenían caracteres escapados, '\ nvem texto \ n 'por ejemplo. corregido utilizando comillas dobles para evitar que rspec doble escape. – lfender6445

Cuestiones relacionadas