Ruby:如何判断字符是否为大写/小写

Ruby:如何判断字符是否为大写/小写,ruby,Ruby,我很惭愧地问这个问题,因为这似乎应该是显而易见的,但在Ruby中如何判断字符串中的给定字符是大写还是小写呢?我在String类中没有看到明显的罐装解决方案 我求助于以下,不考虑非ASCII代码: def is_lower?(c) c >= 'a' && c <= 'z' end def is_upper?(c) ! is_lower(c) end 有什么更惯用的方法吗?使用正则表达式模式:[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

有什么更惯用的方法吗?

使用正则表达式模式:[a-Z]或:

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

我认为没有比这更地道的了。您可以做的唯一一件事——而不是将字符串作为参数传递——是对
string
类进行monkey-patch:

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
使用上述评论员建议的方法和monkey patching
String
,您可以执行以下操作:

class String
  def is_upper?
    !!self.match(/\p{Upper}/)
  end

  def is_lower?
    !!self.match(/\p{Lower}/)
    # or: !self.is_upper?
  end
end

验证字符是大写还是小写的最简单方法:

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

这个非常简单的
if循环
可以通过检查字母是否等于大写形式来确定字母的“大小写”。如果它已经是大写的,那么它显然是
true

匹配的转换不会模拟libc
isupper()
islower()
函数的功能,因为这两个函数对于非alpha都应该返回
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

字符串小写是什么意思?这是指字符串只包含小写字符还是不包含任何大写字符?就我而言,我想要:

“a2”。#u更低吗?#=>真的
…这让我想到:

class String

  def is_upper?
    not self.match /[[:lower:]]/
  end

  def is_lower?
    not self.match /[[:upper:]]/
  end

end

请注意,
/\p{Lower}/
可能更好,但Ruby 1.8不支持。

只需使用if语句,例如,如果c==c.upcase或如果c==c.downcase,则使用

检查哪个描述了一种实现此目的的方法,它应该是Unicode-aware。请记住,字母比
a
z
多得多@TADMAN——我确实指出它不考虑非ASCII代码。我仍然感到震惊的是,Ruby似乎提供了一个方法/钩子,不提供这种常用的方法。卡费内科马:鲁比非常努力地做正确的事情。但是,在这个特殊的例子中,不清楚什么是正确的,因此Ruby不这样做。例如:对于既不是大写也不是小写的字符,您的两个方法应该返回什么?或者对于在某些语言中被视为大写而在某些语言中被视为小写的字符?注意在第二种解决方案中也不需要
self
,您只需执行
!!匹配(/\p{Upper})
,但对于某些人来说,这可能不是很清楚。如果您使用的是ActiveSupport,我认为使用
match(/\p{Upper}/).present?
我建议使用
self!=self.downcase
self!=
的self.upcase
是上的吗?
是下的吗?
,因为
“?”。upcase==”?“
如果循环?为什么不使用begin开关呢?这只适用于ASCII字符,而这个问题已经有几个答案可以很好地适用于非ASCII字符。当然,我有一个特定的要求来严格模拟isupper()和islower()C函数,所以我认为这可能与其他需要严格遵守的情况相匹配。这很公平。伪文本
class String

  def is_upper?
    not self.match /[[:lower:]]/
  end

  def is_lower?
    not self.match /[[:upper:]]/
  end

end