2011-01-11 12 views
26

Bunun nasıl yapılacağından emin değilim, normal ifadeler konusunda oldukça yeni olduğumdan ve bunu gerçekleştirmek için uygun yöntemi bulamıyor gibi görünmüyor ancak aşağıdakileri yaptığımı söylüyorum: dizeRuby, tüm boşlukları tek boşluklara indir

1/2 cup 




      onion   
      (chopped) 

nasıl tüm boşlukları kaldırmak ve sadece tek bir boşluk ile her geçtiği yerde değiştirmek (tüm sekmeler ve satırbaşları dahil)?

str.squeeze([other_str]*) → new_str 
Builds a set of characters from the other_str parameter(s) using the procedure described for String#count. Returns a new string where runs of the same character that occur in this set are replaced by a single character. If no arguments are given, all runs of identical characters are replaced by a single character. 

    "yellow moon".squeeze     #=> "yelow mon" 
    " now is the".squeeze(" ")   #=> " now is the" 
    "putters shoot balls".squeeze("m-z") #=> "puters shot balls" 

cevap

53

Bu boşluk karakterleri aynı bütün sınıfını tedavi etmek ve bir ile boşluk herhangi bir kombinasyonu silsileleri değiştirmek istiyorum, çünkü düzenli ifadeler, iyi iş bir durumdur:

+1

Bu doğru cevap. Ve güzel bir isim, ekleyebilirim . :) –

8

Sen sıkma yöntemi istiyorum tek boşluk karakteri. Bu dize s saklanır, o zaman yapacağını Yani:

fixed_string = s.gsub(/\s+/, ' ') 
+1

Bu doğru değil, bence. Sadece sekmelerin çalışmalarını tek bir sekmede ve yeni satırların tek bir satırda çalışmasını sağlar. Okuduğum gibi, soru, herhangi bir boşluk karakter karakterinin tek bir boşluk karakteriyle çalışmasını değiştirmenin bir yolunu arıyor. – Chuck

+0

Çok kötü 'String.squeeze' argüman olarak normal ifadeyi kabul etmiyor. Bunun iyi bir fikir olacağını düşünüyorsanız; Bir PR gönderebilirim. – the911s

+2

da bu çiftleri kaldırır, örn. "class", "html" üzerinde çalışıyorsa bir anlaşma kırıcı olabilir "clas" olur. daha uygun yöntem (eğer raylarda ise) olurdu Dize # squish – engineerDave

3

seçilen cevap non-breaking space karakterleri kaldırmaz.

Bu 1.9 içinde çalışması gerekir:

fixed_string = s.gsub(/(\s|\u00A0)+/, ' ')

+0

Ben OP anlamsız boşluğu kaldırmak istediğini tahmin ediyorum (yani birden fazla boşluk karakteri çalışır) çeki düzen ve çoklu ardışık boşluk karakter web tarayıcıları tarafından tek uzaya çöktü olsun beri, HTML yönelik dizeleri boyutunu azaltmak için Her neyse ... Bu yüzden, HTML'de anlamsız alanların _not_ anlamsız olduğunu, çökmediklerini, yani muhtemelen onları kaldırmak istemediğinizi unutmayın. – callum

4

en basit çözümü gsub(/\s+/, ' ') sorun her alanını değiştirir gibi çok yavaş olmasıdır, bu tek olsa bile. Ancak genellikle kelimeler arasında 1 boşluk vardır ve sırayla 2 veya daha fazla boş alan varsa düzeltmemiz gerekir.

Daha iyi çözüm gsub(/[\r\n\t]/, ' ').gsub(/ {2,}/, ' ') - eğer bir active_support uzantıları String#squish kullanabilirsiniz Raylar içinde normale boşluk

def method1(s) s.gsub!(/\s+/, ' '); s end 
def method2(s) s.gsub!(/[\r\n\t]/, ' '); s.gsub!(/ {2,}/, ' '); s end 

Benchmark.bm do |x| 
    n = 100_000 
    x.report('method1') { n.times { method1("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } } 
    x.report('method2') { n.times { method2("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } } 
end;1 

#  user  system  total  real 
# method1 4.090000 0.010000 4.100000 ( 4.124844) 
# method2 1.590000 0.010000 1.600000 ( 1.611443) 
11

ilk özel beyaz alanlara kurtulmak ve daha sonra sıkın.

require 'active_support' 

s = <<-EOS 
1/2 cup 

      onion 
EOS 

s.squish 
# => 1/2 cup onion