2015-10-21 12 views
6

Sto provando a convalidare le stringhe in ruby. Qualsiasi stringa che contenga spazi, sotto punteggi o caratteri speciali dovrebbe fallire. La stringa valida deve contenere solo caratteri a-zA-Z0-9 Il mio codice è simile.Regex per verificare la stringa alfanumerica nel rubino

def validate(string) 
    regex ="/[^a-zA-Z0-9]$/ 
    if(string =~ regex) 
     return "true" 
    else 
     return "false" 
end 

sto ottenendo l'errore: TypeError: tipo non corrispondente: String dato.

Qualcuno può, per favore, farmi sapere qual è il modo corretto di farlo?

+0

Vedere http://ideone.com/TKD3QW –

+0

'contiene solo caratteri a-zA-Z0-9' Probabilmente questo'/^ [a-zA-Z0-9] + $/' – sln

+1

@sln:'^'e' $ 'non significa ciò che pensi che facciano in refex di Ruby, ma tu preferisci sempre' \ A' e '\ z' invece. –

risposta

3

È possibile controllare se nella stringa è presente un carattere speciale.

def validate str 
chars = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a 
str.chars.detect {|ch| !chars.include?(ch)}.nil? 
end 

Risultato:

irb(main):005:0> validate "hello" 
=> true 
irb(main):006:0> validate "_90 " 
=> false 
+0

Grazie per la soluzione. –

+1

Suggerisco 'str.chars.all? {| Ch | chars.include? (ch)} '(per una migliore leggibilità). Inoltre, usare 'chars' come nome di variabile insieme al metodo' chars' potrebbe essere fonte di confusione. Meglio evitare i nomi delle variabili che sono i nomi dei metodi. –

3

Se state convalidando una linea:

def validate(string) 
    !string.match(/\A[a-zA-Z0-9]*\z/).nil? 
end 

Non c'è bisogno di ritorno su ciascuno.

+0

Hai ragione, risolto. –

0

Simile a @ rohit89:

VALID_CHARS = [*?a..?z, *?A..?Z, *'0'..'9'] 
    #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", 
    # "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
    # "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", 
    # "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
    # "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 

def all_valid_chars?(str) 
    a = str.chars 
    a == a & VALID_CHARS 
end 

all_valid_chars?('a9Z3') #=> true 
all_valid_chars?('a9 Z3') #=> false 
0

No regex:

def validate(str) 
    str.count("^a-zA-Z0-9").zero? #^means "not" 
end 
0

Grandi risposte di cui sopra, ma appena cronaca, il messaggio di errore è perché hai iniziato la tua regex con una doppia citazione ". Noterai che hai un numero dispari (5) di virgolette nel tuo metodo.

Inoltre, è probabile che si desideri restituire true e false come valori anziché come stringhe tra virgolette.

+0

Grazie per aver indicato che Aaron. –

Problemi correlati