2010-02-08 17 views

risposta

30

È possibile utilizzare il metodo =~ della classe String con la regex /\d/ come argomento.

Ecco un esempio:

s = 'abc123' 

if s =~ /\d/   # Calling String's =~ method. 
    puts "The String #{s} has a number in it." 
else 
    puts "The String #{s} does not have a number in it." 
end 
5
if /\d/.match(theStringImChecking) then 
    #yep, there's a number in the string 
end 
7

In alternativa, senza usare un espressione regolare:

def has_digits?(str) 
    str.count("0-9") > 0 
end 
+2

è probabilmente meno efficiente, se si ignora il sovraccarico di compilazione dell'espressione regolare (che è corretto se il test viene eseguito in un loop di grandi dimensioni o se la stringa da controllare è molto lunga). Per un caso degenerativo, la soluzione deve attraversare l'intera stringa mentre una corretta espressione regolare si interromperà non appena viene trovata una cifra. –

+0

mentre questo potrebbe non essere al massimo efficiente, è molto leggibile che può essere migliore per determinate situazioni. –

2

Invece di usare qualcosa come "s = ~/\ d /", vado per le s più brevi [/ \ d /] che restituisce nil per una miss (AKA false in un test condizionale) o l'indice del colpo (AKA true in un test condizionale). Se hai bisogno del valore attuale usa s [/ (\ d) /, 1]

Dovrebbe funzionare tutto allo stesso modo ed è in gran parte la scelta di un programmatore.

1
!s[/\d/].nil? 

può essere una funzione autonoma -

def has_digits?(s) 
    return !s[/\d/].nil? 
end 

o ... aggiungendolo alla classe String rende ancora più conveniente -

class String 
    def has_digits? 
    return !self[/\d/].nil? 
    end 
end 
Problemi correlati