2011-04-24 1 views
14

Non sono un esperto di rubini e potrebbe sembrare una domanda stupida ... ma sono troppo dispiaciuto per una stranezza (credo) che ho trovato nel matcher di RSpec chiamato match.ruby ​​rspec e confronto di stringhe

Si conosce match immette in input una stringa o un'espressione regolare. Esempio:

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

La strana inizia quando si inseriscono i caratteri regex speciali nella stringa di input:

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

Ciò significa che (ho pensato) che le stringhe di input sono interpretati come espressione regolare, allora dovrei fuggire regex speciale caratteri per rendere funziona:

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

da questo test di base, capisco che tratta i match stringhe di input come espressioni regolari ma non è così permetti di sfuggire ai caratteri speciali regex.

Sono vero? Non è un comportamento singolare? Voglio dire, è una stringa o un'espressione regolare!


EDIT dopo la risposta:

seguito DigitalRoss (a destra) di rispondere alle seguenti test superato:

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

risposta

10

Quello che state vedendo è la diversa interpretazione dei caratteri backslash escape in stringa vs Regexp . In un (") stringa tra virgolette morbido, \* diventa un *, ma /\*/ è davvero un backslash seguito da una stella.

Se si utilizzano le virgolette dure (') per gli oggetti stringa o doppio dei barre rovesciate (solo per le stringhe, però) i tuoi test dovrebbero produrre gli stessi risultati

+0

Grazie hai ragione Ho modificato la domanda con i test di codice che hai citato –

+1

Puoi anche sfuggire alle espressioni regolari come stringhe, ad esempio % r {\\ * test \\ *} Non così utile con questo perché hai ancora bisogno di barre retroverse, ma l'ho trovato di valore inestimabile quando si combina per/ – Ghoti

+0

leggermente correlato , ma mi sono imbattuto in un problema simile - il mio era intorno a confronti di stringhe contenenti caratteri di escape, \ nsome text \ n 'per esempio. corretto usando virgolette per impedire a rspec di fare doppio escape. – lfender6445