2012-03-15 20 views
5

boşluk, nokta, virgül veya çift tırnak üzerine Bölme değil:Boş dizeler oluşturmadan Ruby'de metin nasıl bölünür? tek tırnak üzerinde

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

Nasıl ikna edici boş dizeleri kaldırmak için?

MIN_LENGTH değerinden daha kısa olan dizeler nasıl kaldırılır?

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

cevap

7

split kullanımı fikri bu durumda doğru değil. scan kullanıyor olmalısınız. MIN_LENGTH veya daha uzun dizeleri eşleştirmek amacıyla

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

, böyle yapın: bölünmüş zaman kullanılmalı sınırlayıcı olduğunda

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

, ne zaman tarama

  • kullanmak dağınık ve onları bir regex yapmak zor, scan kullanın.
  • Eklenecek alt dizgeler dağınıksa ve normal ifadeyle eşleşmeleri zor olduğunda, split kullanın.
  • Ayıklanacak alt dizelerin formuna koşullar uygulamak istediğinizde, scan.
  • Sınırlayıcılar formunda koşullar uygulamak istediğinizde, split'u kullanın.
+0

Bu aslında yapmaya çalıştığım şey için çok daha iyi. 'split' iyi değil çünkü diğer olası sınırlayıcıları, örneğin,!, -,?, ~,:, vs. gibi anlamanız gerekir. –

+0

Tobias ilk soruya en iyi cevabı verdi: 'str.split/[\ s \. "] + /' –

6

Bunu yapmak için basit bir yol düşünürdüm olduğunu sadece boş dizelerden kaçınmak istiyorsanız, neden ayırıcılarınızın bir veya daha fazla örneğini'a bölmeyin?

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

İşleri ve anlaşılması kolay. –

1
MIN_LENGTH = 2 

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

aşağıda deneyin: aşağıdaki gibi

8

Sorun etki alanında tamamen açık değilim, ama:

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

Biz birden çok yolla aynı elde edebilirsiniz,

> 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"] 
İlgili konular