将字符串缩短为前n个单词。

26

如何将字符串截断为前n个单词?


你是只使用 Ruby,还是使用 Ruby on Rails? - Andrew Grimm
4个回答

41
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"]

24
str.split(/\s+/, n+1)[0...n].join(' ') 可以提高性能。 - sawa
1
这将获取前4个单词,而不是3个。 - Zack Xu
3
请使用...范围字面量而不是..。三个点将排除第n个值。 - user513951
你说得对。我忽略了。我的错。正因为这个原因,我认为下面的解决方案更好,因为它更清晰明了。 - Zack Xu
1
关于: truncate(my_string, :length => 300, :separator => ' ') 其中300为字符数。你将无法选择单词数量,但也并不是那么糟糕! - Nima Izadi
1
应该是 my_string.truncate(300, separator: ' ') 吧?http://apidock.com/rails/String/truncate - Yo Ludke

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 Improvement(但愿我仍然是一个数学家,那将成为一个伟大的定理)。
trunc = s[/(\s*\S+){#{n}}/]

如果您需要处理一个大于字符串 s 中单词数量的n,则可以使用以下变体:
s[/(\S+(\s+)?){,#{n}}/].strip

4
优化后的代码:trunc = s[/(\s*\S+){#{n}}/]。不需要使用 strip - sawa
1
@sawa:你可以把这个(以及你的split方法的版本)作为一个答案,对现有答案的改进和澄清是值得的。 - mu is too short
1
@GiangNguyen:在这种情况下,您可以使用s[/(\S+(\s+)?){,#{n}}/].strip - mu is too short

4
你可以使用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) * ' ' 是等效且更短的写法(更具惯用性,对于初学者来说可能不是很清晰)。
你还可以使用 first 的替代方法 take,所以下面的写法也可以实现同样的功能。
a.split.take(2) * ' '

4
如果代码是从Rails 4.2中获取的(该版本具有truncate_words功能),则可能会出现以下情况:
string_given.squish.truncate_words(number_given, omission: "")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接