Подтвердить что ты не робот

Обрезать строку до первых n слов

Какой лучший способ обрезать строку для первых n слов?

4b9b3361

Ответ 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"]

Ответ 2

Вы можете сделать это следующим образом:

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

если вы не возражаете сделать копию.

Вы также можете применить Улучшение Саввы (желаю, чтобы я все еще был математиком, это было бы отличное имя для теоремы), отредактировав определение пробелов:

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

Если вам нужно иметь дело с n, который больше, чем количество слов в s, вы можете использовать этот вариант:

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) * ' '