Подтвердить что ты не робот

Ruby: как определить, имеет ли символ верхний/нижний регистр

Мне стыдно спрашивать об этом, потому что кажется, что это должно быть очевидно, но как определить, является ли данный символ в строке верхним или нижним регистром в 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

Есть ли что-то более идиоматическое для этого?

4b9b3361

Ответ 1

Используйте шаблон регулярного выражения: [A-Z] или:

/[[:upper:]]/.match(c)

Ответ 2

Я не думаю, что есть что-то более идиоматическое. Единственное, что вы могли бы сделать - вместо передачи в строке в качестве аргумента - патч обезьяны класса 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

Ответ 3

Что это означает, что строка должна быть строчной? Означает ли это, что строка содержит только символы нижнего регистра или что она не содержит символов верхнего регистра? В моем случае я хочу:

"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.

Ответ 4

Согласование преобразования не эмулирует функциональные возможности функций 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

Ответ 5

Самый простой способ проверить, является ли символ строчным или строчным:

#Can be any character
char = 'a'
if char === char.capitalize then
  return 'Character is uppercase.'
else
  return 'Character is lowercase.'
end

Этот очень упрощенный if loop может определить "случай" буквы, проверяя, соответствует ли она форме в верхнем регистре. Если он уже имеет верхний регистр, это будет, очевидно, true.

Ответ 6

Просто используйте оператор if, например if c == c.upcase или if c == c.downcase.