2013-04-24 101 views
1

我想打一個條件語句,將檢查:檢查字符串中有超過15個字符的字

comment.user.name 

(這可能會返回類似"Montgomery Philips Ridiculouslylonglastname")包含大於15的任何話字符。

喜歡的東西:

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

回答

7

這個怎麼樣?

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

這裏是美妙的enumerable mixin文檔。

+2

如果它只是被'split'而不是'分裂( '')'? – Mischa 2013-04-24 07:46:17

+0

@Mischa嗯,我以爲他的原始字符串上有'.'分割。我可能是錯的。 – squiguy 2013-04-24 07:46:51

+0

來自問題的引用:(可能會返回類似「Montgomery Philips Ridiculouslylonglastname」) – Mischa 2013-04-24 07:47:48

0
w = "Montgomery Philips Ridiculouslylonglastname" 
w.split().any? {|i| i[16] != nil} #=> true 

"Montgomery Philips".split().any? {|i| i[16] != nil} #=> false 
0
def contains_longer_than length 
    comment.user.name.split.select{|x| x.length > length}.size > 0 
end 
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倍!

+0

'\ S'不是我想的。非空格字符和單詞字符之間有區別。 – pguardiario 2013-04-24 10:21:39

+0

@pguardiario你是對的;最接近'split('')'的匹配模式可能是'[^]'(它也比\ S'更快)(答案更新) – mdesantis 2013-04-24 12:21:07

5

僅供參考(如你已經找到一個合適的答案),用正則表達式做:

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

如果你找到一個匹配,有超過15個字符(標題20)一個字的長度。

+0

感謝15/20混合的正則表達式方法 – Jaqx 2013-04-24 07:55:04

0

Loamhoof是接近,但還有一個更簡單的正則表達式:

/\w{16}/