2012-03-15 12 views
5

विभाजन, और नहीं एकल उद्धरण पर:खाली स्ट्रिंग्स के बिना रूबी में टेक्स्ट कैसे विभाजित करें? खाली स्थान के, अवधि, अल्पविराम या दोहरे उद्धरण चिह्नों पर

str = %Q{this is the.string to's split,real "ok" nice-like.} 
str.split(/\s|\.|,|"/) 
=> ["this", "is", "the", "string", "", "", "", "to's", "split", "real", "", "ok", "", "nice-like"] 

कैसे अर्थपूर्ण रिक्त स्ट्रिंग दूर करने के लिए?

MIN_LENGTH से कम स्ट्रिंग को निष्पक्ष रूप से कैसे हटाएं?

str.split(/\s|\.|,|"/).select{|s| s.length >= MIN_LENGTH} 

उत्तर

7

split का उपयोग करने का विचार इस मामले में सही नहीं है। आपको scan का उपयोग करना चाहिए।

str = %Q{this is the.string to's split,real "ok" nice-like.} 
str.scan(/[\w'-]+/) 
# => ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"] 

आदेश तार कि MIN_LENGTH या उससे अधिक समय कर रहे हैं से मेल करने के लिए, इस तरह कार्य करें:

MIN_LENGTH = 3 
str.scan(/[\w'-]{#{MIN_LENGTH},}/) 
# => ["this", "the", "string", "to's", "split", "real", "nice-like"] 

स्प्लिट का उपयोग करने के दौरान, जब स्कैन

  • उपयोग करने के लिए परिसीमक हैं जब गन्दा और एक रेगेक्स मैच बनाना मुश्किल है, scan का उपयोग करें।
  • जब निकालने के लिए सबस्ट्रिंग गन्दा होते हैं और रेगेक्स मैच बनाते हैं तो उन्हें मुश्किल होती है, split का उपयोग करें।
  • जब आप निकालने के लिए सबस्ट्रिंग के रूप में शर्तों को लागू करना चाहते हैं, तो आप scan
  • जब आप डिलीमीटर के रूप में शर्तों को लागू करना चाहते हैं, तो split का उपयोग करें।
+0

यह वास्तव में बहुत बेहतर है जो मैं करने की कोशिश कर रहा था। 'स्प्लिट' अच्छा नहीं है क्योंकि आपको अन्य सभी संभावित डिलीमीटरों को समझना है, जैसे!, -,?, ~,:, आदि –

+0

टोबीस ने पहले प्रश्न का सबसे अच्छा जवाब दिया: 'str.split/[\ s \। "] /' –

6

मुझे लगता है कि ऐसा करने के लिए एक आसान तरीका लगता होगा इस प्रकार है यदि आप केवल खाली तारों से बचना चाहते हैं, तो पर विभाजित क्यों न करें अपने विभाजक के?

str.split /[\s\.,"]+/ 
+0

वर्क्स और समझने में आसान। –

1
MIN_LENGTH = 2 

new_strings = str.split(/\s|\.|,|"/).reject{ |s| s.length < MIN_LENGTH } 
2

नीचे का प्रयास करें::

str.split(/\s*[.,"\s]\s*/) 
8

मैं इस समस्या डोमेन पर पूरी तरह स्पष्ट नहीं हूँ, लेकिन

2

हम कई मायनों में एक ही प्राप्त कर सकते हैं,

> str.split(/[\s\.,"]/) - [""] 
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"] 

> str.split(/[\s\.,"]/).select{|sub_string| sub_string.present?} 
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice-like"] 

> str.scan /\w+'?\w+/ 
=> ["this", "is", "the", "string", "to's", "split", "real", "ok", "nice", "like"] 
संबंधित मुद्दे