如何检查单词在Ruby中是否已经全部大写?

问题描述 投票:24回答:4

我希望能够检查一个单词是否已经全部大写。它也可能包括数字。

示例:

GO234 => yes
Go234 => no
ruby-on-rails ruby ruby-on-rails-3.1
4个回答
46
投票

您可以将字符串与相同的字符串进行比较,但大写:

'go234' == 'go234'.upcase  #=> false
'GO234' == 'GO234'.upcase  #=> true

25
投票
a = "Go234"
a.match(/\p{Lower}/) # => #<MatchData "o">

b = "GO234"
b.match(/\p{Lower}/) # => nil

c = "123"
c.match(/\p{Lower}/) # => nil

d = "µ"
d.match(/\p{Lower}/) # => #<MatchData "µ">

因此,当匹配结果为nil时,它已经是大写字母,否则某些东西是小写字母。

谢谢@mu太简短了,我们应该使用/ \ p {Lower} /来匹配非英语的小写字母。


4
投票

我正在使用@PeterWong的解决方案,只要您要检查的字符串不包含任何特殊字符(如注释中指出的那样),它就可以很好地工作。

但是,如果您想将其用于“Überall”之类的字符串,只需添加以下微小修改:

utf_pattern = Regexp.new("\\p{Lower}".force_encoding("UTF-8"))

a = "Go234"
a.match(utf_pattern) # => #<MatchData "o">

b = "GO234"
b.match(utf_pattern) # => nil

b = "ÜÖ234"
b.match(utf_pattern) # => nil

b = "Über234"
b.match(utf_pattern) # => #<MatchData "b">

玩得开心!


2
投票

您可以比较string和string.upcase是否相等(如JCorc所示。)

irb(main):007:0> str = "Go234"
=> "Go234"
irb(main):008:0> str == str.upcase
=> false

OR

您可以致电arg.upcase!并检查是否为零。 (但这将修改原始参数,因此您可能必须创建一个副本)

irb(main):001:0> "GO234".upcase!
=> nil
irb(main):002:0> "Go234".upcase!
=> "GO234"

更新:如果您希望它适用于uni ..(多字节),则string#upcase将不起作用,您需要this SO question中提到的unicode-util gem>

© www.soinside.com 2019 - 2024. All rights reserved.