2011-12-16 19 views

Respuesta

33

se puede comparar la secuencia con la misma cadena, pero en mayúsculas:

'go234' == 'go234'.upcase #=> false 
'GO234' == 'GO234'.upcase #=> true 

Esperanza esto ayuda

+2

Esto solo funciona para ASCII. Del [manual fino] (http://ruby-doc.org/core-1.9.3/String.html#method-i-upcase): "La operación es insensible a la configuración regional, solo caracteres" a "a" z " se ven afectados. Nota: el reemplazo del caso es efectivo solo en la región ASCII ". –

+0

Para no ASCII pruebe .mb_chars, por ejemplo: 'ТАК' == 'так'.mb_chars.upcase.to_s – nub

+0

solución corta e inteligente – Ravindra

23
a = "Go234" 
a.match(/\p{Lower}/) # => #<MatchData "o"> 

b = "GO234" 
b.match(/\p{Lower}/) # => nil 

c = "123" 
c.match(/\p{Lower}/) # => nil 

d = "µ" 
d.match(/\p{Lower}/) # => #<MatchData "µ"> 

Por eso, cuando el resultado del partido es nula , ya está en mayúsculas, de lo contrario, algo está en minúsculas.

Gracias @mu es demasiado breve mencionar que deberíamos usar/\ p {Lower}/en su lugar para hacer coincidir letras minúsculas que no sean en inglés.

+0

Aunque sospecho que esto se romperá rápidamente en los alfabetos no ingleses ... ¿tienen los RE ruby ¿Alguna ayuda más específica de Unicode? –

+0

No creo que haya problema ya que solo coincide con minúsculas de la a a la z. Hice una prueba rápida en mi irb (ruby 1.9.2 p270) y funciona bien :) – PeterWong

+6

Probablemente quieras '/ \ p {Lower} /' con 1.9. Compare ''μ'.match (/ [a-z] /)' y '' μ'.match (/ \ p {Lower} /)' por ejemplo. –

2

Usted podría comparar la secuencia y string.upcase por la igualdad (como se muestra por JCorc ..)

irb(main):007:0> str = "Go234" 
=> "Go234" 
irb(main):008:0> str == str.upcase 
=> false 

O

que se podría llamar arg.upcase! y verifica si no. (Pero esto va a modificar argumento original, por lo que es posible que tenga que crear una copia)

irb(main):001:0> "GO234".upcase! 
=> nil 
irb(main):002:0> "Go234".upcase! 
=> "GO234" 

Actualización: Si quieres que esto funcione para Unicode .. (multi-byte), a continuación, la cadena # upcase no lo hará trabajo, necesitarías la gema unicode-util mencionada en this SO question

+0

Incorrecto, el método 'upcase' solo funciona para ASCII, por lo que se perderán letras minúsculas como μ (griego) y щ (cirílico). –

+0

@muistooshort - actualizado. El cartel no dio ninguna indicación de que quisiera que esto funcione para Unicode. Así que asumió el caso más simple ... de todos modos actualizado! – Gishu

3

Estoy usando la solución de @PeterWong y funciona muy bien siempre que la cadena con la que estás comprobando no contenga ningún carácter especial (como en los comentarios).

Sin embargo, si desea utilizarlo para cadenas como "Überall", sólo tiene que añadir esta ligera modificación:

utf_pattern = Regexp.new("\\p{Lower}".force_encoding("UTF-8")) 

a = "Go234" 
a.match(utf_pattern) # => #<MatchData "o"> 

b = "GO234" 
b.match(utf_pattern) # => nil 

b = "ÜÖ234" 
b.match(utf_pattern) # => nil 

b = "Über234" 
b.match(utf_pattern) # => #<MatchData "b"> 

Que se diviertan!

Cuestiones relacionadas