【发布时间】:2011-06-04 08:56:39
【问题描述】:
将字符串截断为前 n 个单词的最佳方法是什么?
【问题讨论】:
-
您是只使用 Ruby 还是 Ruby on Rails?
将字符串截断为前 n 个单词的最佳方法是什么?
【问题讨论】:
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"]
【讨论】:
str.split(/\s+/, n+1)[0...n].join(' ') 将提高性能。
... 范围文字,而不是..。三个点不包括第 n 个值。
truncate(my_string, :length => 300, :separator => ' ') 300 是字符数。您将无法选择字数,但这还不错!
my_string.truncate(300, separator: ' ')吗? apidock.com/rails/String/truncate
你可以这样做:
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}}/]
如果您必须处理大于s 中的字数的n,那么您可以使用此变体:
s[/(\S+(\s+)?){,#{n}}/].strip
【讨论】:
trunc = s[/(\s*\S+){#{n}}/]。你不需要strip。
split 方法的版本)作为答案,对现有答案进行改进和澄清是值得的。
s[/(\S+(\s+)?){,#{n}}/].strip。
如果它来自 rails 4.2(具有 truncate_words),则可能会出现以下情况
string_given.squish.truncate_words(number_given, omission: "")
【讨论】:
您可以使用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) * ' '
【讨论】: