2011-06-04 9 views
23

पहले एन शब्दों में स्ट्रिंग को छोटा करने का सबसे अच्छा तरीका क्या है?पहले एन शब्दों में स्ट्रिंग स्ट्रिंग

+0

आप कर रहे हैं से है यह निम्न किया जा सकता है क्या करना होगा रूबी, या रेल पर रूबी का उपयोग कर? –

उत्तर

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 ('') 'प्रदर्शन में सुधार करेगा। – sawa

+1

इसे पहले 4 शब्द मिलेगा, न कि 3. –

+3

@ZackXu सुनिश्चित करें कि आप '...' रेंज का उपयोग करें, न कि '..' एक। तीन बिंदुओं में एनएच मूल्य शामिल नहीं है। –

9

आप इस तरह यह कर सकता है:

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

यदि आप एक प्रतिलिपि बनाने आपत्ति नहीं है।

तुम भी Sawa's सुधार लागू हो सकते हैं (काश मैं अभी भी एक गणितज्ञ थे, कि एक प्रमेय के लिए एक महान नाम होगा) खाली स्थान के पता लगाने का समायोजन करके:

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

आप एक n से निपटने के लिए है, तो यह है कि s तो आप इस प्रकार का उपयोग कर सकते में शब्दों की संख्या से अधिक है:

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

एक सुधार: 'trunc = s [/ (\ s * \ S +) {# {n}} /]'। आपको 'स्ट्रिप' की आवश्यकता नहीं है। – sawa

+1

@ सावा: आप इसे (और 'स्प्लिट' दृष्टिकोण का अपना संस्करण) के रूप में नीचे दिए गए उत्तरों के उत्तर, सुधार और स्पष्टीकरण के रूप में डाल सकते हैं। –

+0

@sawa, और स्पीडअप दिखाते हुए एक बेंचमार्क जोड़ें। –

3

आप n किसी भी संख्या होने के साथ str.split.first(n).join(' ') उपयोग कर सकते हैं।

मूल स्ट्रिंग में संगत सफेद रिक्त स्थान लौटाई गई स्ट्रिंग में एक सफेद स्थान के साथ प्रतिस्थापित किए जाते हैं।

उदाहरण के लिए, आईआरबी में इस प्रयास करें:

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

इस वाक्य रचना बहुत स्पष्ट है (के रूप में यह सूचकांक द्वारा नियमित अभिव्यक्ति, सरणी टुकड़ा प्रयोग नहीं करते)। यदि आप रूबी में प्रोग्राम करते हैं, तो आप जानते हैं कि स्पष्टता एक महत्वपूर्ण स्टाइलिस्ट पसंद है।

join के लिए एक आशुलिपि * है तो इस वाक्य रचना str.split.first(n) * ' ' बराबर है और कम (अधिक मुहावरेदार, uninitiated के लिए कम स्पष्ट) है।

तुम भी takefirst के बजाय का उपयोग कर सकते तो निम्न एक ही बात

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

अगर यह रेल 4.2 (जो truncate_words है)

string_given.squish.truncate_words(number_given, omission: "") 
संबंधित मुद्दे