【发布时间】:2011-12-16 03:55:55
【问题描述】:
我希望能够检查一个单词是否已经全部大写。它还可能包含数字。
例子:
GO234 => yes
Go234 => no
【问题讨论】:
-
我不知道 ruby,但我确信有类似
ToUpper的东西。对照这个函数检查实际的字符串。
标签: ruby
我希望能够检查一个单词是否已经全部大写。它还可能包含数字。
例子:
GO234 => yes
Go234 => no
【问题讨论】:
ToUpper 的东西。对照这个函数检查实际的字符串。
标签: ruby
您可以将字符串与相同但大写的字符串进行比较:
'go234' == 'go234'.upcase #=> false
'GO234' == 'GO234'.upcase #=> true
【讨论】:
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}/ 来匹配非英文小写字母。
【讨论】:
/\p{Lower}/ 1.9。例如比较'µ'.match(/[a-z]/) 和'µ'.match(/\p{Lower}/)。
upcase 方法仅适用于 ASCII:ruby-doc.org/core-1.9.3/String.html#method-i-upcase
我正在使用@PeterWong 的解决方案,只要您检查的字符串不包含任何特殊字符(如 cmets 中所指出的),它就可以很好地工作。
但是,如果您想将它用于“Ü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">
玩得开心!
【讨论】:
您可以比较字符串和 string.upcase 是否相等(如 JCorc.. 所示)
irb(main):007:0> str = "Go234"
=> "Go234"
irb(main):008:0> str == str.upcase
=> false
或
你可以调用 arg.upcase!并检查为零。 (但这会修改原始参数,因此您可能必须创建一个副本)
irb(main):001:0> "GO234".upcase!
=> nil
irb(main):002:0> "Go234".upcase!
=> "GO234"
更新:如果您希望它适用于 unicode..(多字节),那么 string#upcase 将不起作用,您需要 this SO question 中提到的 unicode-util gem
【讨论】:
upcase 方法仅适用于 ASCII,因此它会丢失小写字母,例如 µ(希腊语)和 щ(西里尔字母)。