2011-06-04 57 views

回答

39
n = 3 
str = "your long long input string or whatever" 
str.split[0...n].join(' ') 
=> "your long long" 


str.split[0...n] # note that there are three dots, which excludes n 
=> ["your", "long", "long"] 
+23

'str.split(/ \ s + /,n + 1)[0 ... n] .join('')'會提高性能。 – sawa 2011-06-04 10:11:58

+1

這將得到前4個單詞,而不是3. – 2014-05-15 17:14:10

+3

@ZackXu確保您使用'...'範圍字面值,而不是'..'。三個點不包括第n個值。 – 2014-05-15 17:19:06

9

你可以做這樣的:

s  = "what's the best way to truncate a ruby string to the first n words?" 
n  = 6 
trunc = s[/(\S+\s+){#{n}}/].strip 

,如果你不介意做一個副本。

你也可以申請Sawa's改進(希望我仍然是一個數學家,這將是一個定理,一個偉大的名字)通過調整空白檢測:

trunc = s[/(\s*\S+){#{n}}/] 

如果你要處理的n那比s那麼你可以使用這個變體字的數目大:

s[/(\S+(\s+)?){,#{n}}/].strip 
+4

改進:'trunc = s [/(\ s * \ S +){#{n}} /]'。你不需要'strip'。 – sawa 2011-06-04 09:43:46

+1

@sawa:你可以把它(和你的'split'方法的版本)作爲答案,改進和澄清現有的答案是值得的。 – 2011-06-04 18:06:13

+0

@sawa,並添加一個顯示加速的基準。 – 2011-06-04 21:40:55

3

您可以使用str.split.first(n).join(' ') 其中n爲任何數字。在原始字符串

毗連空格被替換爲返回的字符串中的單個空格。

例如,嘗試在這個IRB:

>> a='apple orange pear banana pineaple grapes' 
=> "apple orange pear banana pineaple grapes" 
>> b=a.split.first(2).join(' ') 
=> "apple orange" 

此語法是很清楚的(因爲它不通過索引使用正則表達式,陣列切片)。如果你用Ruby編程,你知道清晰是一種重要的風格選擇。

一種用於join速記是* 所以此語法str.split.first(n) * ' '是等效和更短(更地道,對於外行不太清楚)。

您還可以使用的take代替first 所以下面會做同樣的事情

a.split.take(2) * ' ' 
4

如果它的軌道4.2(有truncate_words)

string_given.squish.truncate_words(number_given, omission: "")