2011-06-04 19 views
23

Bir dizgiyi ilk n kelimesine kesmenin en iyi yolu nedir?İlk dilde sözcük dizesini kes

+0

misiniz geliyor, bu takip edebilir yapacağını take yerine first ait kullanabilirsiniz sadece Ruby veya Ruby on Rails kullanarak? –

cevap

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 ('')' performansı artırır. – sawa

+1

bu ilk 4 kelime olsun, 3 değil. –

+3

@ZackXu '...' aralığını kullandığınızdan emin olun. Üç nokta nth değerini içermez. –

9

Böyle yapabileceğini:

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

Bir kopya yapma sakıncası yoksa.

Ayrıca Sawa's İyileştirme uygulanabilecek boşluk algılama ayarlayarak (Yani bu bir teoremi için büyük bir isim olacağını hala matematikçi olsaydı): Bir n uğraşmak zorunda varsa

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

o o zaman bu varyant kullanabilirsiniz s kelimelerin sayısından daha büyük: sen n herhangi bir sayı olmak üzere str.split.first(n).join(' ') kullanabilirsiniz

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

Bir gelişme: trunc = s [/ (\ s * \ S +) {# {n}} /] '. "Strip" e ihtiyacınız yok. – sawa

+1

@sawa: Bunu (ve 'split' yaklaşımının versiyonunu) bir cevap olarak, mevcut cevapların iyileştirilmesi ve açıklığa kavuşturmak için kullanabilirsiniz. –

+0

@sawa ve hızlandırmayı gösteren bir kıyaslama ekleyin. . Bu durumda s [/ (? \ S + (\ s +)) {# {n}} /] şerit 'kullanabilirsiniz: –

3

. Orijinal dizesinde

Bitişik beyaz boşluk döndürülen dizede tek boşluk ile değiştirilir.

Örneğin, irb şunu deneyin:

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

Bu sözdizimi çok açıktır (o dizine göre düzenli ifade, dizi dilim kullanmaz gibi). Ruby'de program yapıyorsanız, netliğin önemli bir stilistik seçim olduğunu biliyorsunuz.

join için bir kısaltmadır * olduğunu Yani bu sözdizimi str.split.first(n) * ' ' (Deneyimsiz için bu kadar net, daha deyimsel) eşdeğer ve kısadır.

Ayrıca böylece aşağıdaki aynı şeyi

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

o (truncate_words vardır) raylar 4,2

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