2010-02-10 12 views
43

Come eseguire una stringa rispetto a un'espressione regolare in modo che restituisca true se la stringa intera corrisponde (non una sottostringa)?Come posso testare una stringa WHOLE contro la regex in ruby?

esempio:

test(\ee\ , "street") #=> returns false 
test(\ee\ , "ee") #=> returns true! 

Grazie.

+21

Dare un uomo un confronto di stringhe e lui sarà vero, dare un uomo una regex e perderà ogni capacità di ragionare e cercare su Internet. – Lazarus

+0

@doctororange, saresti così gentile da accettare l'arrivo di Tomas Markauskas? Non riesco a rimuovere la mia risposta da quando l'hai accettata, ma ho dimenticato che le maniglie di Ruby (alcune) regex metadati in modo diverso rispetto alla maggior parte delle implementazioni di espressioni regolari. Grazie. –

+0

Fatto. Grazie a entrambi per le risposte. – doctororange

risposta

64

È possibile abbinare l'inizio della stringa con \A e la fine con \Z. In ruby ​​^ e $ partita anche l'inizio e la fine della linea, rispettivamente:

>> "a\na" =~ /^a$/ 
=> 0 
>> "a\na" =~ /\Aa\Z/ 
=> nil 
>> "a\na" =~ /\Aa\na\Z/ 
=> 0 
+4

Si desidera utilizzare \ z anziché \ Z per far corrispondere l'intera stringa. '" hi \ n "= ~/\ Ahi \ Z /' –

+1

Il valore di ritorno (quando non è nullo) è l'indice del primo carattere della prima corrispondenza. –

4

Allora, che cosa si sta chiedendo è come per verificare se le due stringhe sono uguali, giusto? Usa semplicemente l'uguaglianza delle stringhe! Questo passa ogni singolo uno degli esempi che voi e Tomas citati:

'ee' == 'street' # => false 
'ee' == 'ee'  # => true 
"a\na" == 'a'  # => false 
"a\na" == "a\na" # => true 
+2

Questo è vero, ma un'espressione regolare consente anche di espandere la definizione di "uguale" a cose come/^ (ee | oo) $/piuttosto bene. – doctororange

+5

Eri riuscito a ottenere quei cinque ups? Voglio dire è stato davvero così utile per 5 persone per essere detto che è possibile verificare l'uguaglianza delle stringhe con l'operazione di uguale ...: o xD Non intendo offesa, ma hey andiamo, è vero? – Timo

+1

@Timo Lehto: Supera ogni singola specifica fornita dall'OP, più ogni altro nell'altra risposta, ed è molto più semplice dell'altra risposta. Non vedo cosa c'è di sbagliato in questo. –

15

Questo sembra funzionare per me, anche se sembra brutto (probabilmente un modo più interessante si può fare):

!(string =~ /^ee$/).nil? 

Ovviamente tutto ciò che c'è dentro // sopra può essere una qualsiasi regex che si desidera.

Esempio:

>> string = "street" 
=> "street" 
>> !(string =~ /^ee$/).nil? 
=> false 
>> string = "ee" 
=> "ee" 
>> !(string =~ /^ee$/).nil? 
=> true 

Nota: Testato in console Rails con rubino (1.8.7) e le rotaie (3.1.1)

Problemi correlati