2013-05-06 8 views
7

मैं अगर वहाँ पूरे शब्द को काटे बिना स्ट्रिंग से केवल एन प्रतीकों प्राप्त करने के लिए एक आसान तरीका जानना चाहता हूँ काटने के बिना स्ट्रिंग से पहले एन वर्ण प्राप्त करें।पूरे शब्द

उदाहरण के लिए, मैं उत्पादों और उत्पादों विवरण जानकारी नहीं है। वर्णन लंबाई 70 से 500 प्रतीकों से है, लेकिन मैं केवल पहले 70 प्रतीकों इस तरह प्रदर्शित करना चाहते हैं:

कोका कोला के साथ ही, इतिहास में सबसे लोकप्रिय और सर्वाधिक बिकने वाले शीतल पेय है दुनिया में सबसे प्रसिद्ध ब्रांड।

8 मई, 2011 को, कोका कोला अपने 125thanniversary मनाया। , अटलांटा, जॉर्जिया में 1886 में निर्मित डॉ जॉन एस पेम्बर्टन, कोका कोला द्वारा पहले कार्बोनेटेड पानी के साथ कोका कोला सिरप मिश्रण से याकूब के फार्मेसी के फव्वारे के पेय के रूप में की पेशकश की गई थी।

तो, साधारण उप स्ट्रिंग विधि मुझे दे देंगे:

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

प्रतीक? क्या आपका मतलब "पात्र" है? –

उत्तर

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

यह विधि एक regexp जो लालच से उपयोग करता है 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

मुझे इस समाधान को समझने में कठिनाई हो रही है। क्या आप मुझे बता सकते हैं कि क्या हो रहा है? –

+0

@ जेकस्मिथ हम एक स्ट्रिंगक्स पैटर्न के खिलाफ संभावित रूप से छोटा होने के लिए एस स्ट्रिंग से मेल खाते हैं। पैटर्न में कैप्चर ग्रुप के रूप में किसी भी चरित्र '(। {1, # {max}}) की अधिकतम पुनरावृत्ति के लिए लालच से मिलान करने के लिए एक खंड होता है, इसके बाद एक व्हाइटस्पेस चार का गैर-कैप्चरिंग मैच करने के लिए एक खंड या स्ट्रिंग का अंत '(?: \ s | \ z)'। मैच परिणाम पर '[1]' पहले कैप्चर को निकाल देता है। यदि वह कैप्चर पूरे स्ट्रिंग से छोटा है, तो यह इलिप्स को जोड़ता है। – dbenhur

+0

नोट, यह संभवतः काम नहीं कर सकता है जब पहले अधिकतम वर्णों में कोई सफेद स्थान या स्ट्रिंग का अंत नहीं होता है। जैसे "कर्नल ..." या शायद सिर्फ "..." के बजाय "ola ..." में truncate (s, 3) परिणाम। यदि इस मामले में आप पहले एन अक्षर प्राप्त करना चाहते हैं, तो नीचे प्रेरित समाधान देखें। –

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

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 
संबंधित मुद्दे