Я хочу, чтобы проверить, если слово УЖЕ все в верхнем регистре. И это может также включать числа.
Пример:
GO234 => yes
Go234 => no
Я хочу, чтобы проверить, если слово УЖЕ все в верхнем регистре. И это может также включать числа.
Пример:
GO234 => yes
Go234 => no
Вы можете сравнить строку с той же строкой, но в верхнем регистре:
'go234' == 'go234'.upcase #=> false
'GO234' == 'GO234'.upcase #=> true
Надеюсь, что это поможет
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 "µ">
Итак, когда результат совпадения равен нулю, он уже в верхнем регистре, иначе что-то находится в нижнем регистре.
Спасибо @mu слишком коротко сказано, что мы должны использовать /\ p {Lower}/вместо этого, чтобы соответствовать строчным буквам, отличным от английского.
Я использую решение @PeterWong, и он отлично работает, пока строка, которую вы проверяете, не содержит специальных символов (как указано в комментариях).
Однако, если вы хотите использовать его для строк типа "Überall", просто добавьте эту небольшую модификацию:
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">
Удачи!
Вы можете либо сравнить строку и string.upcase для равенства (как показано JCorc..)
irb(main):007:0> str = "Go234"
=> "Go234"
irb(main):008:0> str == str.upcase
=> false
ИЛИ
вы можете вызвать arg.upcase! и проверьте нуль. (Но это изменит исходный аргумент, поэтому вам может понадобиться создать копию)
irb(main):001:0> "GO234".upcase!
=> nil
irb(main):002:0> "Go234".upcase!
=> "GO234"
Обновление: если вы хотите, чтобы это работало в unicode.. (многобайтный), то строка # upcase не будет работать, вам понадобится камень unicode-util, упомянутый в этот вопрос SO