2010-02-08 13 views

Antwort

30

Sie können die =~ Methode der String Klasse mit den regex /\d/ als Argument.

Hier ist ein Beispiel:

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

Alternativ ohne eine regex:

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

das ist wahrscheinlich weniger effizient, wenn Sie den Overhead des Kompilierens des regulären Ausdrucks ignorieren (was fair ist, wenn der Test in einer großen Schleife durchgeführt wird oder die zu überprüfende Zeichenfolge sehr lang ist). Für einen degenerativen Fall muss Ihre Lösung die gesamte Zeichenfolge durchlaufen, während ein ordnungsgemäßer regulärer Ausdruck stoppt, sobald eine Ziffer gefunden wird. –

+0

während dieser nicht maximal effizient sein kann, ist es sehr gut lesbar, was für bestimmte Situationen besser sein kann. –

2

Anstatt verwenden so etwas wie "s = ~/\ d /", gehe ich für die kürzeren s [/ \ d /], die für einen Fehltreffer nil (AKA false in einem konditionellen Test) oder den Index des Treffers (AKA true in einem konditionellen Test) zurückgibt. Wenn Sie den tatsächlichen Wert benötigen, verwenden Sie s [/ (\ d) /, 1]

Es sollte alles gleich funktionieren und ist weitgehend eine Wahl des Programmierers.

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

Kann eine eigenständige Funktion sein -

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

oder ... es in die String-Klasse Zugabe macht es noch bequemer -

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