Обрезать строку до первых n слов - PullRequest
26 голосов
/ 04 июня 2011

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

Ответы [ 4 ]

41 голосов
/ 04 июня 2011
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"]
9 голосов
/ 04 июня 2011

Вы можете сделать это так:

s     = "what's 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
4 голосов
/ 22 апреля 2015

Это может быть следующим, если это из рельсов 4.2 (которые имеют truncate_words)

string_given.squish.truncate_words(number_given, omission: "")
3 голосов
/ 15 мая 2014

Вы можете использовать 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) * ' '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...