3

次のことを確認する条件文を作成したいと思います。

comment.user.name

( のようなものが返される場合があり"Montgomery Philips Ridiculouslylonglastname"ます) には、15 文字を超える単語が含まれています。

何かのようなもの:

if comment.user.name.split(" ").???
4

6 に答える 6

8

これはどう?

comment.user.name.split.any? { |x| x.length > 20 }

ここに素晴らしいenumerablemixin ドキュメントがあります。

于 2013-04-24T07:36:29.777 に答える
5

参考までに(すでに適切な答えを見つけているので)、正規表現でそれを行います:

/\b[a-z]{15,}\b/i

一致する単語が見つかった場合は、15 文字 (タイトルに 20 文字) を超える単語があります。

于 2013-04-24T07:44:56.060 に答える
2

正規表現を使用すると、文字列が何らかのパターンに一致するかどうかを確認するためだけにまったく新しい配列を作成するよりもクリーンです (正規表現はこのために作成されました!):

('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?です!

于 2013-04-24T07:44:13.707 に答える
0

Loamhoof は近いですが、もっと単純な正規表現があります。

/\w{16}/
于 2013-04-24T08:15:47.380 に答える
0
def contains_longer_than length
  comment.user.name.split.select{|x| x.length > length}.size > 0
end
于 2013-04-24T07:42:46.653 に答える