2011-06-04 13 views

Respuesta

39
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"] 
+23

'str.split (/ \ s + /, n + 1) [0 ... n] .join ('')' mejorará el rendimiento. – sawa

+1

esto obtendrá las primeras 4 palabras, no 3. –

+3

@ZackXu Asegúrese de usar el rango '... 'literal, no el' ..'. Tres puntos excluye el enésimo valor. –

9

Se podía hacerlo de esta manera:

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

si no le importa hacer una copia.

También podría aplicar Sawa's Mejoras (desea todavía era un matemático, que sería un gran nombre para un teorema) mediante el ajuste de la detección de los espacios en blanco:

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

Si usted tiene que tratar con un n que es mayor que el número de palabras en s entonces se podría utilizar esta variante:

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

Una mejora: 'trunc = s [/ (\ s * \ S +) {# {n}} /]'. No necesitas 'strip'. – sawa

+1

@sawa: Podría poner eso (y su versión del enfoque 'dividir') como una respuesta, las mejoras y aclaraciones de las respuestas existentes valen la pena. –

+0

@sawa, y agregue un punto de referencia que muestre la aceleración. –

3

puede utilizar str.split.first(n).join(' ') siendo n cualquier número.

Los espacios blancos contiguos en la cadena original se reemplazan con un espacio en blanco único en la cadena devuelta.

Por ejemplo, intente esto en IRB:

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

Esta sintaxis es muy claro (ya que no utiliza la expresión regular, array rebanada por índice). Si programa en Ruby, sabe que la claridad es una elección estilística importante.

Una forma abreviada de join es * Así que esta sintaxis str.split.first(n) * ' ' es equivalente y más corto (más idiomática, menos clara para los no iniciados).

También puede utilizar take en lugar de first por lo que el siguiente sería hacer lo mismo

a.split.take(2) * ' ' 
4

Esto podría ser seguido si es de carriles 4.2 (que tiene truncate_words)

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