2012-02-02 25 views
14

'Bu bir Test' olmak için 'Bu 101 Testi' istiyorum ama sözdizimini doğru alamıyorum.Sözcük olmayan karakterleri bir metinden nasıl çıkarabilirim?

src = 'This Is A 101 Test' 
puts "A) " + src      # base => "This Is A 101 Test" 
puts "B) " + src[/([a-z]+)/]   # only does first word => "his" 
puts "C) " + src.gsub!(/\D/, "")  # Does digits, I want alphabetic => "101" 
puts "D) " + src.gsub!(/\W///g)  # Nothing. => "" 
puts "E) " + src.gsub(/(\W|\d)/, "") # Nothing. => "" 

cevap

27

İlk önce, gsub ve gsub! ile dikkatli olmanız gerekir. İkincisi "tehlikeli!" ve src değerini değiştirecek. Bu ifadeleri sırayla yürütüyorsanız, a.gsub!(/a/, "b") ve a = a.gsub(/a/, "b") öğelerinin her ikisinin de a ile aynı şeyi yapacağını unutmayın. Kodunuzdaki sorunun bir kısmı, src'un değiştirilmekte olmasıdır.

src.gsub!(/\D/, "") # => "101" 
src     # => "101" 

D yöntemi çalışmaz:

B yöntemi "his" döndürür ama source

src[/([a-z]+)/]  # => "his" 
src     # => "This Is A 101 Test" 

hiçbir değişiklik yapmaz C yöntemi numaraları olmayan tüm karakterleri kaldırır çünkü sözdizimi yanlış. gsub yöntemi, aramak için düzenli bir ifade/dize ve sonra değiştirmek için kullanılacak bir dize kabul eder. IRB'de denerseniz, bir yere daha / ihtiyacınız olduğu gibi davranacaktır.

src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces) 
src      # => "This Is A 101 Test" 

Bunu "" döndürüyor işaret:

E metodu dışındaki tüm sözcük karakterleri ve tüm numaraları yerine geçer. Peki, aslında oluyor C ve D listelenen (sözdizimi sorunları düzeltildi) bu yıkıcı değişiklikler. E sadece "101" çalıştırılıyor Yani ("101" üzerinde çalıştırırsanız ikame yok gerçekleştirildi olarak Ayrıca, D aslında. nil dönecektir) ve "" ile olmayan tüm kelimeleri ve tüm sayılar değiştiriyoruz beri, bu "101" olur .

src.gsub!(/\d\s?/, "") # => "This Is A Test" 
src     # => "This Is A Test" 

Ve squeeze oldukça etkilidir çünkü karakterler gibi birleştirerek en (çift boşluk tüm senaryolar ile başa çıkmak için benim favori, strip geçerli:


aradığınız cevabı gibi bir şey olurdu oldukça sıyırma arka boşluktan etkin ve bu ! dönüş nil onlar) bir yedek yaparsanız:

src = src.gsub(/\d+/, "").squeeze(" ").strip 
+0

yerinde. Teşekkürler! Rubular için –

4

Dizgeden '101' kesmek ister misiniz? Burada gsub ait patlama sürümünü kullanıyorsanız neden anlamıyorum Ayrıca düzenli ifade

src = 'This Is A 101 Test' 

puts src.gsub /\ \d+/, '' 
# => This Is A Test 

bu. gsub!, özgün dizgiyi değiştirir, gsub kopyalar ve kopyayı değiştirir.

+0

değil çalışma: +/'' ^ ' –

+2

@MichaelDurrant' koyar "F)" + src.gsub/\ d. Dize artık düşündüğün gibi değil. Gsub! 'Yi gsub’a değiştirin ve tekrar deneyin. –

+0

Benim için çalıştı. Tam olarak gönderdiği gibi yap. src.gsub (/ \ \ d + /, '') 'seçeneğini işaretler. @SergioTulentsev'in dediği gibi, “gsub” yönteminin “bang” versiyonunu kullanmamalısınız. [Bang sürümü için dokümanlar okuyun] (http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21), orijinal dizeyi manipüle eder. – Batkins

3

Numaraları silmek mi istiyorsunuz? Eğer öyleyse, src.gsub(/\d/,"") çalışmalıdır. Yukarıda çalışmadığı neden gsub! çağrıldığı dizeyi değiştirir, böylece C'den sonra src = "101" ve tüm basamakları eleyerek boş bir dize bırakır.

Alfabetik karakterler ve boşluklardan (örneğin, rakamlar ve noktalama işaretleri) her şeyi ortadan kaldırmak isterseniz, src.gsub(/(?=\S)(\d|\W)/,"") çalışmalıdır.

Alfabetik karakterlerden (boşlukları ve rakamları ve noktalama işaretlerini ortadan kaldırarak) her şeyi ortadan kaldırmak isterseniz, src.gsub(/\d|\W/,"") çalışmalıdır.

8

Tüm "sözcük olmayan karakterleri" kaldırmak için yalnızca bunları kullanabilirsiniz.

src = 'This Is A 101 Test' 
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ') 
=> "This Is A Test" 

Ben Ruby düzenli ifadeler denemek için Rubular önerilir.

+1

+1, bu harika! –

7

yok regexp'in: çalışır:

src = 'This Is A 101 Test' 
src.delete('^a-zA-Z ') #the^negates everything 
İlgili konular