【问题标题】:How can I check a word is already all uppercase?如何检查一个单词是否已经全部大写?
【发布时间】:2011-12-16 03:55:55
【问题描述】:

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

例子:

GO234 => yes
Go234 => no

【问题讨论】:

  • 我不知道 ruby​​,但我确信有类似 ToUpper 的东西。对照这个函数检查实际的字符串。

标签: ruby


【解决方案1】:

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

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

【讨论】:

  • 这仅适用于 ASCII。来自fine manual:“该操作不区分区域设置——仅影响字符“a”到“z”。注意:大小写替换仅在 ASCII 区域有效。”。
  • 如果不是 ASCII,请尝试 .mb_chars,例如:'ТАК' == 'так'.mb_chars.upcase.to_s
  • 短而智能的解决方案
【解决方案2】:
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}/ 来匹配非英文小写字母。

【讨论】:

  • 虽然我怀疑这会很快破坏非英文字母... ruby​​ RE 是否有更多特定于 Unicode 的支持?
  • 你可能想要/\p{Lower}/ 1.9。例如比较'µ'.match(/[a-z]/)'µ'.match(/\p{Lower}/)
  • That ([a-z]) 假设只有 a-z 字符可以是小写字母(例如英文字母),但不能是 щ(俄语 Щ 的小写字母)。
  • 最好使用Unicode properties 来处理这类事情。
  • +1 用于学习您的课程并为后代做好准备。 upcase 方法仅适用于 ASCII:ruby-doc.org/core-1.9.3/String.html#method-i-upcase
【解决方案3】:

我正在使用@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">

玩得开心!

【讨论】:

    【解决方案4】:

    您可以比较字符串和 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,因此它会丢失小写字母,例如 µ(希腊语)和 щ(西里尔字母)。
    • @muistooshort - 已更新。海报没有表明他希望这适用于 unicode。所以假设最简单的情况......无论如何都更新了!
    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2021-09-13
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2021-07-13
    • 2011-07-06
    相关资源
    最近更新 更多