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

Geo*_*old 34 ruby

我很惭愧地问这个,因为它似乎应该是显而易见的,但是如何判断字符串中的给定字符在Ruby中是大写还是小写?我认为String班上没有明显的罐装解决方案.

我采用了以下方法,它不考虑非ASCII代码:

def is_lower?(c)
  c >= 'a' && c <= 'z'
end

def is_upper?(c)
  ! is_lower(c)
end
Run Code Online (Sandbox Code Playgroud)

我考虑过的其他事情是:

def is_lower?(c)
    c != c.upcase
end
Run Code Online (Sandbox Code Playgroud)

这有什么更惯用的东西吗?

fel*_*s77 45

使用正则表达式模式:[AZ]或:

/[[:upper:]]/.match(c)
Run Code Online (Sandbox Code Playgroud)


Mis*_*cha 27

我不认为有更多的惯用语.你可以做的唯一的事情 - 而不是传递字符串作为参数 - 是猴子补丁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
Run Code Online (Sandbox Code Playgroud)

使用上面的评论者和猴子修补建议的答案中的方法String,你可以这样做:

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

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

  • 我仍然感到震惊的是,Ruby 似乎为所有事情提供了方法/钩子,但却没有提供这种开箱即用的通用方法! (4认同)
  • @CaffeineComa:Ruby非常努力地做正确的事情.然而,在这种特殊情况下,正确的是什么并不明显,因此Ruby不会这样做.例如:对于既不是大写也不是小写的字符,你的两个方法应该返回什么?或者对于在某些语言中被认为是大写并且在某些语言中被认为是小写的字符? (2认同)

小智 6

只需使用 if 语句,例如if c == c.upcaseor if c == c.downcase

  • `"-".upcase == "-"` 为 true (2认同)

小智 5

匹配转换不会模拟 libcisupper()islower()函数的功能,因为两者都应该返回false非 alpha。

范围似乎是对单个字符执行此操作的最简单方法。

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
Run Code Online (Sandbox Code Playgroud)


小智 5

字符串小写是什么意思?这是否意味着该字符串仅包含小写字符或不包含任何大写字符?就我而言,我想要:

"a2".is_lower? #=> true
Run Code Online (Sandbox Code Playgroud)

..这导致我:

class String

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

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

end
Run Code Online (Sandbox Code Playgroud)

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