Bagaimana cara menghapus karakter non alfanumerik dari string dan mempertahankan spasi?

98

Saya ingin membuat regex yang menghapus semua karakter non-alfanumerik tetapi tetap menggunakan spasi. Ini untuk membersihkan input pencarian sebelum mencapai db. Inilah yang saya miliki sejauh ini:

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

Masalah di sini adalah menghapus semua spasi. Solusi tentang bagaimana mempertahankan ruang?

Keluar
sumber
Saya tidak melakukan pengembangan Rails, tetapi mengapa Anda tidak membiarkan Rails melakukan sanitasi?
Andrew Grimm

Jawaban:

187

Tambahkan spasi ke grup karakter yang dinegasikan:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
jwueller.dll
sumber
4
Ruang kosong tidak berfungsi untuk saya, jadi '\ s' juga bisa menjadi opsi: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
sedikit kurang bertele-tele:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Tepatnya, ini menghapus semua huruf beraksen dan mungkin tidak dapat disesuaikan dengan beberapa bahasa.
Uelb
@DavidDouglas Itu seharusnya \stidak\\s
Dex
9

Dalam hal ini saya akan menggunakan metode bang (gsub! Bukan gsub) untuk membersihkan input secara permanen.

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

Ini menghindari situasi di mana @seach_query digunakan di tempat lain dalam kode tanpa membersihkannya.

nvugteveen
sumber
2
Versi bang akan mengembalikan nol jika tidak ada yang cocok. Mungkin bukan hasil yang Anda inginkan atau harapkan. Dari dokumen "Melakukan substitusi String # gsub di tempat, mengembalikan str, atau nil jika tidak ada substitusi yang dilakukan. Jika tidak ada blok dan tidak ada penggantian yang diberikan, enumerator dikembalikan."
dft
2
Dalam contohnya, nilai kembalian tidak digunakan, jadi itu tidak terlalu relevan.
Jaap Haagmans
3

Saya akan menggunakan pendekatan inklusi. Daripada mengecualikan semua kecuali angka, saya hanya akan memasukkan angka. Misalnya

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

Mungkin ini akan berhasil untuk kasus seperti itu:

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

Jawaban yang lebih baik (setidaknya di ruby) adalah:

@search_query.gsub!(/^(\w|\s*)/,'')
John Doe
sumber
1
Ini akan menghapus baik (a) satu karakter kata atau (b) sejumlah spasi dari awal string. Sama sekali tidak terkait dengan pertanyaan, dan karena itu bukan jawaban.
Sigi
2
membuat kesalahan besar .. tidak tahu apa yang saya pikirkan: = (
John Doe