Какой лучший способ обрезать строку для первых n слов?
Обрезать строку до первых n слов
Ответ 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) * ' '