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?


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, '')

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.


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

0

Mungkin ini akan berhasil untuk kasus seperti itu:

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

-3

Jawaban yang lebih baik (setidaknya di ruby) adalah:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.