我想做一个条件语句来检查是否:
comment.user.name
(可能返回类似"Montgomery Philips Ridiculouslylonglastname"
)包含任何超过 15 个字符的单词。
就像是:
if comment.user.name.split(" ").???
我想做一个条件语句来检查是否:
comment.user.name
(可能返回类似"Montgomery Philips Ridiculouslylonglastname"
)包含任何超过 15 个字符的单词。
就像是:
if comment.user.name.split(" ").???
仅供参考(因为您已经找到了合适的答案),使用正则表达式:
/\b[a-z]{15,}\b/i
如果您找到匹配项,则表示单词长度超过 15 个字符(标题中为 20 个)。
使用正则表达式比创建一个全新的数组更干净,只是为了检查一个字符串是否匹配某个模式(正则表达式就是为此而生的!):
('a'*19+' '+'a'*19) =~ /[^ ]{20}/ #=> nil
('a'*19+' '+'a'*20) =~ /[^ ]{20}/ #=> 20
这就是我的意思:
$ ruby -rbenchmark -e 'long_string = ([("a"*20)]*1000).join(" ")
puts Benchmark.measure{ 100.times{ long_string.split.any? { |x| x.length > 20 } } }'
#=> 0.050000 0.000000 0.050000 ( 0.051955)
$ ruby -rbenchmark -e 'long_string = ([("a"*20)]*1000).join(" ")
puts Benchmark.measure{ 100.times{ long_string =~ /[^ ]{20}/ } }'
#=> 0.000000 0.000000 0.000000 ( 0.000128)
正则表达式版本比string.split.any?
一个版本快 365 倍!
w = "Montgomery Philips Ridiculouslylonglastname"
w.split().any? {|i| i[16] != nil} #=> true
"Montgomery Philips".split().any? {|i| i[16] != nil} #=> false
def contains_longer_than length
comment.user.name.split.select{|x| x.length > length}.size > 0
end
Loamhoof 很接近,但有一个更简单的正则表达式:
/\w{16}/