我很惭愧地问这个,因为它似乎应该是显而易见的,但是如何判断字符串中的给定字符在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)
这有什么更惯用的东西吗?
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)
小智 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上不受支持。