2013-05-06 63 views
7

我想知道,如果有一個簡單的方法來從字符串僅N個符號,而不切斷整個單詞。獲得從字符串前N個字符不切斷整個單詞

例如,我對我們的產品和產品的描述信息。說明長度爲70到500的符號,但我想只顯示前70個符號是這樣的:

可口可樂是 歷史上最流行和暢銷的最大的軟飲料,還有世界上最知名的品牌。

2011年5月8日,可口可樂慶祝其125thanniversary。創建於1886年 在佐治亞州亞特蘭大,由約翰·彭伯頓S.博士,可口可樂是 第一混合 可口可樂糖漿與碳酸水提供作爲在雅各布的藥店一個礦泉飲料。

所以,普通的子字符串的方法會給我:

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

,我需要一個方法來獲得只有這個:

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

符號?你的意思是「角色」? – 2013-05-06 13:43:50

回答

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

此方法使用正則表達式,其貪婪抓住多達70個字符,並隨後配襯空間或字符串的結尾,以實現自己的目標

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

我很難理解這個解決方案。你能告訴我發生了什麼事嗎? – 2014-10-03 02:43:34

+0

@JakeSmith我們將s字符串匹配爲可能被截斷的正則表達式模式。該模式包含一個子句,用於貪婪地匹配任意字符「(。{1,#{max}})」的最大重複1作爲捕獲組,然後使用子句執行非捕獲匹配的空白字符或字符串'(?:\ s | \ z)'的結尾。匹配結果中的'[1]'提取第一次捕獲。如果該捕獲短於整個字符串,它會附加橢圓。 – dbenhur 2014-10-10 13:41:25

+0

注意,如預期時有在第一最大字符沒有空格或字符串的結束,這可能無法正常工作。例如。 truncate(s,3)會導致「ola ...」而不是「Col ...」或者可能只是「...」。如果在這種情況下,您希望獲得前n個字符,請參閱下面的啓發式解決方案。 – 2015-11-03 19:58:30

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

在你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

不錯,但如果句子沒有空格,將會返回「...」 – justi 2013-10-28 12:47:32

7

只需使用帶有分隔選項截斷:

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

在獲取更多信息:truncate helper in rails API documentation

0

(由dbenhur的答案,但更好的啓發處理在第一個最大值中沒有空白或字符串結尾的情況字符)。

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