【问题标题】:Truncate string to the first n words将字符串截断为前 n 个单词
【发布时间】:2011-06-04 08:56:39
【问题描述】:

将字符串截断为前 n 个单词的最佳方法是什么?

【问题讨论】:

  • 您是只使用 Ruby 还是 Ruby on Rails?

标签: ruby string


【解决方案1】:
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(' ') 将提高性能。
  • 这将得到前 4 个单词,而不是 3 个。
  • @ZackXu 确保使用... 范围文字,而不是..。三个点不包括第 n 个值。
  • 怎么样:truncate(my_string, :length => 300, :separator => ' ') 300 是字符数。您将无法选择字数,但这还不错!
  • 不应该是my_string.truncate(300, separator: ' ')吗? apidock.com/rails/String/truncate
【解决方案2】:

你可以这样做:

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
  • @sawa:您可以将其(以及您的 split 方法的版本)作为答案,对现有答案进行改进和澄清是值得的。
  • @GiangNguyen:在这种情况下,您可以使用s[/(\S+(\s+)?){,#{n}}/].strip
【解决方案3】:

如果它来自 rails 4.2(具有 truncate_words),则可能会出现以下情况

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

【讨论】:

    【解决方案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) * ' ' 是等效的并且更短(更惯用,对于初学者来说不太清楚)。

    您也可以使用take 代替first 所以下面会做同样的事情

    a.split.take(2) * ' '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多