2011-09-09 22 views
18

Voglio creare un test che restituisce true o false per la gestione della posta elettronica.Come determinare se esiste una corrispondenza e un ritorno vero o falso nei binari?

Per ora, se l'indirizzo di posta elettronica inizia con r +, è vero altrimenti è falso. Ciò consentirà al nostro server di ignorare molto dello SPAM con cui siamo colpiti.

Esempi:

[email protected] .. true 
[email protected] .. true 
[email protected] .. FALSE 

Qual è il modo più efficiente per gestire questa situazione con Rails/ruby ​​/ regex?

Grazie

GOAL

è un rivestimento in Rails/rubino con:

ABORT if XXXXX == 0 

risposta

33

Questo corrisponderà:

/^r\+.*@site.com$/ 

Esempi:

>> '[email protected]' =~ /^r\+.*@site.com$/ #=> 0 
>> '[email protected]' =~ /^r\+.*@site.com$/ #=> nil 

Da tutto ciò che non è nil o false è truthy in Ruby, è può usare questo regex in una condizione. Se si vuole veramente un valore booleano è possibile utilizzare il linguaggio !!:

>> !!('[email protected]' =~ /^r\+.*@site.com$/) #=> false 
>> !!('[email protected]' =~ /^r\+.*@site.com$/) #=> true 
+0

Grazie, ma come posso farlo in rotaie/rubino quindi è ABORT se XXXXX == 0 – AnApprentice

+0

Hai provato la tua ultima idea, che porta all'errore di sintassi , inatteso $ indefinito, in attesa di ')' (SyntaxError) – AnApprentice

+0

Ancora non in grado di farlo funzionare, provato se (params [: to] .to_s = ~ (/^r\+.*@site.com$/)) = = nil – AnApprentice

10

Se siete in Rails, c'è uno starts_with? metodo su stringhe:

"foo".starts_with?('f') # => true 
"foo".starts_with?('g') # => false 

Al di fuori di Rails, regex sono una soluzione ragionevole:

"foo" =~ /^f/ # => true 
"foo" =~ /^g/ # => false 

Perché Rubino utilizza truthiness in istruzioni if, se si fa finire con espressioni regolari, si può semplicemente utilizzare il ritorno il valore per passare:

if "foo" =~ /^f/ 
    puts "Was true!" 
else 
    puts "Was false!" 
end 

Se si scrive un metodo e vuole restituire un risultato booleano, si può sempre utilizzare il doppio trucco di botto:

def valid_email? 
    !!("foo" =~ /^f/) 
end 

Rubulare (rubular.com) è un buon sito per testare Ruby regex pre-1.9. (1,9 di espressioni regolari aggiunto cose come lookahead.)

+0

Al di fuori di Rails c'è anche una stringa "start_with?" (Nota singolare). –

+0

Non sono sicuro che mi piaccia l'idea starts_with, corrisponderebbe solo a r e non a r + che sarebbe molto più utile contro gli spammer – AnApprentice

+0

Perché non potresti fare 'start_with? "R +" '? Voglio dire, userei anche una regex in modo che possa corrispondere a qualsiasi cosa prima di un '+', ma start_with? corrisponderà a qualsiasi cosa tu gli dai. –

8

Se non si desidera utilizzare un "!!"Operatore:

!!("foo" =~ /^f/) 

si potrebbe usare un operatore ternario (potrebbe sembra più ovvio):

"foo" =~ /^f/ ? true : false 
6

È possibile utilizzare l'operatore '===' così

/f/ === 'foo' #=> true 

/f/ === 'bat' #=> false 

Nota: la parte regex è sulla sinistra:

/YOUR_REGEX/=== 'YOUR_STRING'

Problemi correlati