Ответ 1
Используйте шаблон регулярного выражения: [A-Z] или:
/[[:upper:]]/.match(c)
Мне стыдно спрашивать об этом, потому что кажется, что это должно быть очевидно, но как определить, является ли данный символ в строке верхним или нижним регистром в Ruby? Я не вижу очевидного законченного решения в классе String
.
Я прибегал к следующему, который не учитывает коды, отличные от ASCII:
def is_lower?(c)
c >= 'a' && c <= 'z'
end
def is_upper?(c)
! is_lower(c)
end
Что-то еще, что я подумал:
def is_lower?(c)
c != c.upcase
end
Есть ли что-то более идиоматическое для этого?
Используйте шаблон регулярного выражения: [A-Z] или:
/[[:upper:]]/.match(c)
Я не думаю, что есть что-то более идиоматическое. Единственное, что вы могли бы сделать - вместо передачи в строке в качестве аргумента - патч обезьяны класса String
:
class String
def is_upper?
self == self.upcase
end
def is_lower?
self == self.downcase
end
end
"a".is_upper? #=> false
"A".is_upper? #=> true
Используя метод ответ, предложенный комментатором выше, и исправление обезьяны String
, вы можете сделать это:
class String
def is_upper?
!!self.match(/\p{Upper}/)
end
def is_lower?
!!self.match(/\p{Lower}/)
# or: !self.is_upper?
end
end
Что это означает, что строка должна быть строчной? Означает ли это, что строка содержит только символы нижнего регистра или что она не содержит символов верхнего регистра? В моем случае я хочу:
"a2".is_lower? #=> true
.., что приводит меня к:
class String
def is_upper?
not self.match /[[:lower:]]/
end
def is_lower?
not self.match /[[:upper:]]/
end
end
Обратите внимание, что /\p{Lower}/
может быть лучше, но не поддерживается в Ruby 1.8.
Согласование преобразования не эмулирует функциональные возможности функций libc isupper()
и islower()
, поскольку оба должны возвращать false
для не-альфа.
Диапазоны кажутся наиболее простым способом для одиночных символов.
class String
def islower?
return false if self.size > 1
('a'..'z').include? self
end
def isupper?
return false if self.size > 1
('A'..'Z').include? self
end
end
Самый простой способ проверить, является ли символ строчным или строчным:
#Can be any character
char = 'a'
if char === char.capitalize then
return 'Character is uppercase.'
else
return 'Character is lowercase.'
end
Этот очень упрощенный if loop
может определить "случай" буквы, проверяя, соответствует ли она форме в верхнем регистре. Если он уже имеет верхний регистр, это будет, очевидно, true
.
Просто используйте оператор if, например if c == c.upcase
или if c == c.downcase
.