次のことを確認する条件文を作成したいと思います。
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)
そして、正規表現バージョンは、それよりも ~ 365 倍高速string.split.any?
です!
Loamhoof は近いですが、もっと単純な正規表現があります。
/\w{16}/
def contains_longer_than length
comment.user.name.split.select{|x| x.length > length}.size > 0
end