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)

正则表达式版本比string.split.any?一个版本快 365 倍!

于 2013-04-24T07:44:13.707 回答
0
w = "Montgomery Philips Ridiculouslylonglastname" 
w.split().any? {|i| i[16] != nil} #=> true

"Montgomery Philips".split().any? {|i| i[16] != nil} #=> false
于 2013-04-24T07:38:55.007 回答
0
def contains_longer_than length
  comment.user.name.split.select{|x| x.length > length}.size > 0
end
于 2013-04-24T07:42:46.653 回答
0

Loamhoof 很接近,但有一个更简单的正则表达式:

/\w{16}/
于 2013-04-24T08:15:47.380 回答