pagid
pagid

Reputation: 13867

Truncate string to the first n words

What's the best way to truncate a string to the first n words?

Upvotes: 26

Views: 14634

Answers (4)

Tilo
Tilo

Reputation: 33732

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"]

Upvotes: 41

kangkyu
kangkyu

Reputation: 6090

This could be following if it's from rails 4.2 (which has truncate_words)

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

Upvotes: 5

Jon Snow
Jon Snow

Reputation: 11882

You can use str.split.first(n).join(' ') with n being any number.

Contiguous white spaces in the original string are replaced with a single white space in the returned string.

For example, try this in irb:

>> a='apple    orange pear banana   pineaple  grapes'
=> "apple    orange pear banana   pineaple  grapes"
>> b=a.split.first(2).join(' ')
=> "apple orange"

This syntax is very clear (as it doesn't use regular expression, array slice by index). If you program in Ruby, you know that clarity is an important stylistic choice.

A shorthand for join is * So this syntax str.split.first(n) * ' ' is equivalent and shorter (more idiomatic, less clear for the uninitiated).

You can also use take instead of first so the following would do the same thing

a.split.take(2) * ' '

Upvotes: 4

mu is too short
mu is too short

Reputation: 434635

You could do it like this:

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

if you don't mind making a copy.

You could also apply Sawa's Improvement (wish I was still a mathematician, that would be a great name for a theorem) by adjusting the whitespace detection:

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

If you have to deal with an n that is greater than the number of words in s then you could use this variant:

s[/(\S+(\s+)?){,#{n}}/].strip

Upvotes: 9

Related Questions