【发布时间】:2019-11-08 02:41:58
【问题描述】:
到目前为止我有:
def capitalized?(str)
str[0] == str[0].upcase
end
问题在于它会为"12345"、"£$%^&" 和"9ball" 等字符串返回true。我希望它仅在第一个字符是大写字母时才返回true。
【问题讨论】:
标签: ruby
到目前为止我有:
def capitalized?(str)
str[0] == str[0].upcase
end
问题在于它会为"12345"、"£$%^&" 和"9ball" 等字符串返回true。我希望它仅在第一个字符是大写字母时才返回true。
【问题讨论】:
标签: ruby
如果第一个字符是A 到Z 范围内的字母,您可以使用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
【讨论】:
使用正则表达式可能有更好的方法,但是保持这个 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
【讨论】:
include?。
Range#cover? 比Range#include? 效率更高,因为前者只检查范围的端点。
如果可能,我会避免使用字符范围,因为在不知道编码的情况下,您永远无法确定范围内的内容。在您的情况下,这是不必要的。一个简单的
/^[[:upper:]]/ =~ str
会的。 POSIX 字符类的定义见here。
【讨论】:
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
【讨论】: