2014-09-08 38 views
5

Burada bir süre aradım ve ihtiyacım olanı tam olarak bulamadım. Ruby (1.9) öğreniyorum ve bir metin dosyasıyla temel bir şeyler yapmaya çalışıyorum. RegEx'in harfleri SADECE satırın başında olmayan harfleri ve boşlukları kaldırmak için kullanmaya çalışıyorum, belirteçleri arasındaki boşlukları görmezden geliyorum (dosyadaki kelimeleri saymaya çalışıyorum, dolayısıyla sözcüklerin arasındaki boşlukları istediğimde).Ruby kullanarak özel karakterleri silme, ancak boşluk kullanmayın

Ör:

555 r6ub6y i7s e7a0sy... w1o2w4. 

değiştirmek için için:

şimdiye kadar ruby rubyfile.rb < test.txt sınamak için komut satırını kullanarak var ne
ruby is easy... wow. 

:

$stdin.each do |line| 
    line.chomp!.downcase! 
    line.gsub!(/[^a-zA-Z]/, "") #this takes away my spaces! 
    puts line 
end 
+0

Hiçbir değişiklik yapılmazsa 'chomp!' 'Nil' döndüreceğini unutmayın. Bu durumda beklenmedik bir davranış olan – JKillian

+0

@JKillian "beklenmedik" veya "istenmeyen" bir durumdur. Değişiklikler uygulanmadığında, dizeler için patlama (!) Yöntemleri genellikle geri döner. Bang, adlandırılan yöntem gibi daha tehlikeli bir mutasyona işaret eder, bazen alıcıyı değiştirir veya bir şekilde patlama olmayan yöntemden farklı sonuçlar üretir. Ben onu görüyorum! Tehlike demek, farklı bir şey bekler. – engineersmnky

+0

@engineersmnky Evet, bang metodlarına aşinayım ve dizilerdeki birçok kişinin "chomp" ile aynı şekilde davrandığı konusunda kesinlikle haklısınız. Ben sadece kişisel olarak, normal versiyonlar gibi zincirlenemediklerini garip buluyorum ... – JKillian

cevap

9
[^a-zA-Z. ] 

bir ekleme uzay da.

+1

E.g., text.each_line {| l | l.downcase.gsub koyar (/ [^ a-zA-Z] /, ''). şerit} '. –

+1

Aslında A-Z 'bölümüne ihtiyacın yok çünkü zaten zaten onu daralttın. –

+1

@MarkThomas, OP'nin normal ifadesini kullanmıştır. – vks

4

Şu andan beri sadece sayıların kaldırılmasını belirliyorsunuz, bu tek bir satır olarak çalışacaktır.

"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/\d/,'').strip 
#=>"ruby is easy... wow." 

Temel olarak, tüm sayıları ve baştaki/sondaki boşlukları kaldırmayı söyler.

Şu anda normal ifadeniz, üst ve alt harflerin herşeyi kaldırdığını söylüyor. emin ne karakterlerin diğer türleri Kaldırılan istedi ama sadece üst/küçük harfleri alanları ve süreleri

Hep \s kullanma eğiliminde bir regex boşluklar dahil Ayrıca
"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/[^a-zA-Z\s.]/,'').strip 
#=>"ruby is easy... wow." 

istiyorsa böyle bir şey de sizin için işe yarayabilecek [ ] gibi zımni bir alan yerine [a-zA-Z ] bir yazım hatası olabilir ve boşluk içermemelidir ama [a-zA-Z\s] boşluk istediğimi söylemek çok okunabilir gibi hissediyorum.

Regex hakkında daha fazla bilgi edinmek için kontrol edin Rubular Ruby için düzenli bir ifade değerlendiricisidir ve her zaman kullanıyorum. Gerçekten tartışmasız tek şey, açgözlü ve açgözlü olmayan yakalama gruplarıdır, ancak şu anda bunun hakkında endişelenmenize gerek olmadığını hissediyorum.

İlgili konular