Comment supprimer les caractères non alphanumériques d'une chaîne et conserver les espaces?

98

Je veux créer une expression régulière qui supprime tous les caractères non alphanumériques mais garde les espaces. Il s'agit de nettoyer l'entrée de recherche avant qu'elle n'atteigne la base de données. Voici ce que j'ai jusqu'à présent:

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

Le problème ici est qu'il supprime tous les espaces. Des solutions pour conserver les espaces?

La sortie
la source
Je ne fais pas de développement de Rails, mais pourquoi ne pouvez-vous pas laisser Rails faire le nettoyage?
Andrew Grimm

Réponses:

187

Ajoutez des espaces au groupe de caractères annulé:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
jwueller
la source
4
L'espace vide ne fonctionnait pas pour moi, donc '\ s' peut aussi être une option: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
un peu moins verbeux:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Juste pour préciser, cela supprime toutes les lettres accentuées et peut ne pas être adapté à certaines langues.
Uelb
@DavidDouglas Cela ne devrait \spas être\\s
Dex
9

Dans ce cas, j'utiliserais la méthode bang (gsub! Au lieu de gsub) afin de nettoyer l'entrée en permanence.

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

Cela évite une situation où @seach_query est utilisé ailleurs dans le code sans le nettoyer.

nvugteveen
la source
2
La version bang retournera nul si rien ne correspond. Probablement pas le résultat souhaité ou attendu. À partir de la documentation "Effectue les substitutions de String # gsub en place, en retournant str ou nil si aucune substitution n'a été effectuée. Si aucun bloc ni aucun remplacement n'est donné, un énumérateur est renvoyé à la place."
dft le
2
Dans son exemple, la valeur de retour n'est pas utilisée, donc ce n'est pratiquement pas pertinent.
Jaap Haagmans
3

J'aurais utilisé l'approche d'inclusion. Plutôt que d'exclure tout sauf les nombres, je n'inclurais que des nombres. Par exemple

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

Peut-être que cela fonctionnera dans un tel cas:

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

Une meilleure réponse (au moins en rubis) est:

@search_query.gsub!(/^(\w|\s*)/,'')
John Doe
la source
1
Cela supprimera (a) un caractère de mot unique ou (b) n'importe quel nombre d'espaces à partir du début de la chaîne. Complètement sans rapport avec la question, et donc pas une réponse.
Sigi
2
fait une grosse erreur ... je ne sais pas ce que je pensais: = (
John Doe