【问题标题】:How can I create a method that checks if a string starts with a capitalized letter?如何创建一个检查字符串是否以大写字母开头的方法?
【发布时间】:2019-11-08 02:41:58
【问题描述】:

到目前为止我有:

def capitalized?(str)
  str[0] == str[0].upcase
end

问题在于它会为"12345""£$%^&""9ball" 等字符串返回true。我希望它仅在第一个字符是大写字母时才返回true。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如果第一个字符是AZ 范围内的字母,您可以使用match? 来返回true,无论是否大写:

    def capitalized?(str)
      str.match?(/\A[A-Z]/)
    end
    
    p capitalized?("12345") # false
    p capitalized?("fooo")  # false
    p capitalized?("Fooo")  # true
    

    您也可以将正则表达式传递给start_with?

    p 'Foo'.start_with?(/[A-Z]/) # true
    p 'foo'.start_with?(/[A-Z]/) # false
    

    【讨论】:

      【解决方案2】:

      使用正则表达式可能有更好的方法,但是保持这个 ruby​​ 为基础,您可以创建一个大写字母数组:

      capital_letters = ("A".."Z")
      

      然后您可以检查您的第一个字母是否在该数组中:

      def capitalized?(str)
        capital_letters = ("A".."Z")
        capital_letters.include?(str[0])
      end
      

      或者更短一点:

      def capitalized?(str)
        ("A".."Z").include?(str[0])
      end
      

      【讨论】:

      • 您不需要将范围转换为数组。 Range 实现了include?
      • 当然可以,但是您需要转换为数组,否则您只会得到 2 个字母 :)
      • Range#cover?Range#include? 效率更高,因为前者只检查范围的端点。
      【解决方案3】:

      如果可能,我会避免使用字符范围,因为在不知道编码的情况下,您永远无法确定范围内的内容。在您的情况下,这是不必要的。一个简单的

      /^[[:upper:]]/ =~ str
      

      会的。 POSIX 字符类的定义见here

      【讨论】:

        【解决方案4】:
        def capitalized?(str)
          str[0] != str[0].downcase
        end
        
        capitalized? "Hello"           #=> true
        capitalized? "hello"           #=> false
        capitalized? "007, I presume"  #=> false
        capitalized? "$100 for that?"  #=> false
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          • 1970-01-01
          • 2020-04-14
          • 1970-01-01
          • 2017-11-27
          • 1970-01-01
          相关资源
          最近更新 更多