2010-03-25 22 views
16

Así que sé en ruby ​​que x.nil? probará si x es nulo.forma más sencilla de comprobar si hay espacios en ruby ​​

¿Cuál es la forma más sencilla de comprobar si x es igual a '', o '' (dos espacios), o '' (tres espacios), etc.?

Básicamente, me pregunto cuál es la mejor manera de probar si una variable es todo espacio en blanco?

+0

déjame aclarar mi pregunta en realidad porque no era totalmente claro ... im ejecutar realmente esto en el contexto de una sentencia if. por lo tanto estoy comprobando x.nil? y también quiero x. (solo hay espacios en blanco aquí, así que lo considero nulo) para que ambos sean evaluados condicionalmente – user301752

+0

@ user301752 cuando dices 'nil' ¿quieres decir una cadena vacía? No son lo mismo en Ruby. (Abra una sesión 'irb' y compruebe:' x = ''; x.nil? '.) – Telemachus

+0

¿por qué no recortar primero? –

Respuesta

15
s =~ /^\s*$/ 

solución de expresiones regulares. Aquí hay un short ruby regex tutorial.

+0

gracias! acabo de empezar a aprender ruby ​​y no me di cuenta de que = ~ evaluaría condicionalmente la expresión regular que es bastante dulce – user301752

+0

@Stefan Creo que quieres '/^\ s + $ /' ya que '' 'coincidirá demasiado (por ejemplo, obtienes una coincidencia) para una cadena vacía - sin espacios en absoluto). – Telemachus

+0

Consideré '' como todos los espacios en blanco. Esto puede o no ser correcto en el dominio del problema, pero no creo que la pregunta esté redactada de tal manera que sea * o + incorrecto. –

0
a = " " 

a.each_byte do |x| 
    if x == 32 
    puts "space" 
    end 
end 
+2

Para el que menosprecia, sería bueno saber qué le pasa a la respuesta (o cómo no es útil) – OscarRyz

+2

Yo no era el que menospreciaba, pero esta no es la solución más simple, ni tampoco está buscando 32 que atrapen todos los espacios en blanco. – miorel

+0

La pregunta era ambigua acerca de si desea espacios o todos los caracteres de espacio en blanco (incluidas pestañas, nuevas líneas, etc.). – Chuck

5

Si x es todo el espacio en blanco, a continuación, x.strip será la cadena vacía. Por lo que puede hacer:

if not x.nil? and x.strip.empty? then 
    puts "It's all whitespace!" 
end 

alternativa, utilizando una expresión regular, x =~ /\S/ volverá falso si y sólo si es x todos los espacios en blanco:

if not (x.nil? or x =~ /\S/) then 
    puts "It's all whitespace!" 
end 
+0

¿Por qué downvote ?! –

+0

No he votado negativamente. – miorel

+0

Mladen se estaba refiriendo a un voto negativo que estaba en su respuesta, sin acusarlo de vengar a otros. – Beanish

0

Basado en su comentario Creo que se puede extender la clase String y definir un método spaces? de la siguiente manera:

$ irb 
>> s = " " 
=> " " 
>> s.spaces? 
NoMethodError: undefined method `spaces?' for " ":String 
    from (irb):2 
>> class String 
>>  def spaces? 
>>   x = self =~ /^\s+$/ 
>>   x == 0 
>>  end 
>> end 
=> nil 
>> s.spaces? 
=> true 
>> s = "" 
=> "" 
>> s.spaces? 
=> false 
>> 
21

"mejor" depende del contexto, pero aquí es una forma sencilla.

some_string.strip.empty? 
26

Si está utilizando rieles, puede simplemente usar:

x.blank? 

Esto es seguro para llamar cuando X es nada, y devuelve verdadero si x es nula o todos los espacios en blanco.

Si no utiliza Rails, puede obtenerlo de la gema activesupport. Instalar con gem install activesupport. En su archivo, ya sea require 'active_support/core_ext para obtener todas las extensiones de soporte activo a las clases base, o require 'active_support/core_ext/string' para obtener solo las extensiones de la clase String. De cualquier forma, el método blank? estará disponible después del requerimiento.

+4

Por cierto, me disculpo con los Rubyistas por arrastrar a Rails a lo que de otra manera sería una agradable y pura discusión sobre Ruby. Es solo un buen patrón para emular. – MikeJ

+0

@ david-miani Es una pena que no haya forma de que pueda +1 editar, porque es excelente. Es un mal tipo de optimización excesiva para arrancar código de ActiveSupport cuando AS ya admite incluir solo las características que necesita. – MikeJ

0

Sin embargo, otro :) string.all? { |c| c == ' ' }

Cuestiones relacionadas