Alfasayısal olmayan karakterleri bir dizeden nasıl çıkarabilirim ve boşluk bırakabilirim?


98

Alfan sayı olmayan tüm karakterleri kaldıran ancak boşluk bırakan bir normal ifade oluşturmak istiyorum. Bu, arama girişini db'ye ulaşmadan önce temizlemek içindir. Şimdiye kadar sahip olduğum şeyler:

@search_query = @search_query.gsub(/[^0-9a-z]/i, '')

Buradaki sorun, tüm boşlukları kaldırmasıdır. Alanların nasıl korunacağına dair çözümler?


Rails geliştirme yapmıyorum, ama neden Rails'in sterilizasyonu yapmasına izin vermiyorsunuz?
Andrew Grimm

Yanıtlar:


187

Negatif karakter grubuna boşluk ekleyin:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')

4
Boş alan benim için işe yaramadı, bu nedenle '\ s' bir seçenek olabilir: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, ")
David Douglas

6
biraz daha az sözlü:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer

3
Kesin olarak, bu tüm aksanlı harfleri kaldırır ve bazı dillere uyarlanmayabilir.
Uelb

Yani olmalı @DavidDouglas \sdeğil\\s
Dex

9

Bu durumda girdiyi kalıcı olarak temizlemek için bang yöntemini (gsub yerine gsub!) Kullanırdım.

#permanently filter all non-alphanumeric characters, except _
@search_query.gsub!(/\W/,'')

Bu, @seach_query'nin kodun başka bir yerinde temizlemeden kullanıldığı bir durumu önler.


2
Eşleşen hiçbir şey yoksa bang sürümü sıfır döndürür. Muhtemelen istediğiniz ya da beklediğiniz sonuç bu değil. Dokümanlardan "Yerinde String # gsub ikamelerini gerçekleştirir, ikame yapılmadıysa str veya nil döndürür. Blok yoksa ve değiştirme verilmezse, bunun yerine bir numaralandırıcı döndürülür."
dft

2
Onun örneğinde dönüş değeri kullanılmıyor, bu yüzden bu hemen hemen alakasız.
Jaap Haagmans

3

Dahil etme yaklaşımını kullanırdım. Rakamlar dışında tümünü hariç tutmak yerine, yalnızca rakamları dahil ederdim. Örneğin

@search_query.scan(/[\da-z\s]/i).join

0

Belki bu böyle bir durumda işe yarar:

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')

-3

Daha iyi bir cevap (en azından yakutta):

@search_query.gsub!(/^(\w|\s*)/,'')

1
Bu, dizenin başından ya (a) tek bir sözcük karakterini ya da (b) herhangi bir sayıda beyaz boşluğu kaldıracaktır. Soru ile tamamen alakasız ve bu nedenle bir cevap değil.
Sigi

2
büyük bir hata yaptım .. ne düşündüğümü bilmiyorum: = (
John Doe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.