2013-05-06 25 views
7

Voglio sapere se esiste un modo semplice per ottenere solo N simboli dalla stringa senza tagliare le parole intere.Ottieni i primi N caratteri dalla stringa senza tagliare le parole intere

Ad esempio, ho informazioni sui prodotti e sulle descrizioni dei prodotti. La lunghezza descrizione è da 70 a 500 simboli, ma voglio visualizzare solo i primi 70 simboli come questo:

Coca-Cola è la bevanda più popolare e più venduto in storia, così come il marchio più conosciuto al mondo.

L'8 maggio 2011, Coca-Cola ha celebrato il suo 125 ° anniversario. Creato in 1886 ad Atlanta, in Georgia, dal Dr. John S. Pemberton, Coca-Cola era prima offerto come bevanda fontana alla Farmacia di Jacob mescolando sciroppo di Coca-Cola con acqua gassata.

Quindi, ordinario sub metodo stringa mi darà:

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

e ho bisogno di un metodo per ottenere solo questo:

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

simboli? Intendi "personaggi"? –

risposta

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

Questo metodo utilizza un espressione regolare che avidamente afferra fino a 70 caratteri e successivamente abbina uno spazio o una fine di stringa per raggiungere il tuo obiettivo

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

Ho difficoltà a capire questa soluzione. Potresti dirmi cosa sta succedendo? –

+0

@JakeSmith Corrispondiamo alla stringa s in modo da essere potenzialmente troncata rispetto a un modello regexp. Il pattern consiste in una clausola per abbinare avidamente da 1 a max ripetizioni di qualsiasi carattere '(. {1, # {max}})' come gruppo di cattura, seguito da una clausola per eseguire una corrispondenza non di cattura di un carattere di spaziatura. o alla fine della stringa '(?: \ s | \ z)'. Il '[1]' sul risultato della partita estrae la prima cattura. Se l'acquisizione è più breve dell'intera stringa, aggiunge le ellissi. – dbenhur

+0

Nota, questo potrebbe non funzionare come previsto quando non ci sono spazi bianchi o fine di stringa nei primi caratteri massimi. Per esempio. truncate (s, 3) risulta in "ola ..." anziché in "Col ..." o forse solo "...". Se in questo caso preferiresti ottenere i primi n caratteri, allora vedi la soluzione ispirata di seguito. –

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

Nel vostro examle:

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

Bello, ma se la frase non ha spazio, "..." verrebbe restituito – justi

7

Basta usare troncare l'opzione di separazione con:

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

ottenere maggiori informazioni presso: truncate helper in rails API documentation

0

(Ispirato dalla risposta di dbenhur ma meglio gestisce il caso in cui non vi è spazio bianco o fine della stringa nel primo max caratteri.)

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