2013-05-06 33 views
7

Tüm kelimeleri kesmeden dizeden yalnızca N sembolleri almanın kolay bir yolu olup olmadığını bilmek istiyorum. Örneğin, ürün ve ürün açıklamalarım hakkında bilgi sahibiyim. açıklama uzunluğu 70 ila 500 sembollerden, ama böyle sadece ilk 70 sembollerini görüntülemek istiyorum:Tüm kelimeleri kesmeden dizeden ilk N karakteri al

Coca-Cola yanı sıra tarihinin en popüler ve en çok satan alkolsüz içecek olduğunu Dünyada en tanınmış marka.

Coca-Cola, 8 Mayıs 2011'de 125. yıldönümünü kutladı. John S. Pemberton tarafından Atlanta, Georgia'da 1886'da düzenlendi, Coca-Cola, Coca-Cola şurubunu karbonatlı su ile karıştırarak Jacob's Pharmacy'de bir çeşme içeceği olarak ilk kez idi.

Yani, sıradan alt dize metodu beni verecektir:

Coca-Cola is the most popular and biggest-selling soft drink in histor 

ve alma yöntemini gereken tek bu:

Coca-Cola is the most popular and biggest-selling soft drink in ... 
+1

Semboller? "Karakterler" mi demek istiyorsun? –

cevap

3
s = "Coca-Cola is the most popular and biggest-selling soft drink in history, as well as the best-known brand in the world." 
s = s.split(" ").each_with_object("") {|x,ob| break ob unless (ob.length + " ".length + x.length <= 70);ob << (" " + x)}.strip 
#=> "Coca-Cola is the most popular and biggest-selling soft drink in" 
5

Bu yöntem hangi açgözlülükle regexpi kullanır 70 karaktere kadar yakalar ve daha sonra hedefinizi gerçekleştirmek için bir boşluk veya dizgenin sonuna denk gelir

senin Examle olarak
def truncate(s, max=70, elided = ' ...') 
    s.match(/(.{1,#{max}})(?:\s|\z)/)[1].tap do |res| 
    res << elided unless res.length == s.length 
    end  
end 

s = "Coca-Cola is the most popular and biggest-selling soft drink in history, as well as the best-known brand in the world." 
truncate(s) 
=> "Coca-Cola is the most popular and biggest-selling soft drink in ..." 
+0

Bu çözümü anlamakta zorlanıyorum. Bana neler olduğunu anlatabilir misin? –

+0

@JakeSmith Bir regexp düzenine karşı potansiyel olarak kesilecek s dizesini eşleştiriyoruz. Kalıp, bir yakalama grubu olarak 1 (en fazla) tekrarı ile eşleşen bir karakterden (1, # {max}}) sonra bir boşluk karakteri içermez. veya '(?: \ s | \ z) 'dizesinin sonu. Maç sonucundaki '[1]', ilk yakalamayı çıkarır. Bu yakalamanın tüm dizeden daha kısa olması durumunda, elipsleri ekler. – dbenhur

+0

Not: İlk maksimum karakterde beyaz boşluk veya dizenin sonu olmadığı zaman bu beklendiği gibi çalışmayabilir. Örneğin. truncate (s, 3) "Col ..." ya da belki "..." yerine "ola ..." ile sonuçlanır. Bu durumda, ilk n karakterleri almayı tercih ederseniz, aşağıdaki ilham çözümüne bakın. –

1
s[0..65].rpartition(" ").first << " ..." 

:

s = "Coca-Cola is the most popular and biggest-selling soft drink in history, as well as the best-known brand in the world."  
t = s[0..65].rpartition(" ").first << " ..." 
=> "Coca-Cola is the most popular and biggest-selling soft drink in ..." 
+0

Güzel, ama cümlenin herhangi bir yeri yoksa "..." iade edilir – justi

7

Sadece ayırıcı seçeneğiyle keser kullanın:

truncate("Once upon a time in a world far far away", length: 17) 
# => "Once upon a ti..." 
truncate("Once upon a time in a world far far away", length: 17, separator: ' ') 
# => "Once upon a..." 

daha bilgi alın: truncate helper in rails API documentation

0

(dbenhur cevabı ama daha iyi esinlenerek İlk max'da beyaz boşluk veya dizginin sonu olmayan durumu ele alır karakter.)

def truncate(s, options = { }) 
    options.reverse_merge!({ 
    max: 70, 
    elided: ' ...' 
    }); 

    s =~ /\A(.{1,#{options[:max]}})(?:\s|\z)/ 
    if $1.nil? then s[0, options[:max]] + options[:elided] 
    elsif $1.length != s.length then $1 + options[:elided] 
    else $1 
    end 
end 
0
b="Coca-Cola is the most popular and biggest-selling soft drink in history, as well " 

def truncate x 
a=x.split("").first(70).join 

w=a.split("").map!.with_index do |x,y| 
    if x!=" " 
     x=nil 
    else 
     x=y 
    end 
end 
w.compact! 
index=w.last 

x.split("").first(index).join+" ..." 
end 

truncate b 
İlgili konular