¿Cómo elimino los caracteres no alfanuméricos de una cadena y mantengo los espacios?

98

Quiero crear una expresión regular que elimine todos los caracteres que no sean alfanuméricos pero mantenga los espacios. Esto es para limpiar la entrada de búsqueda antes de que llegue a la base de datos. Esto es lo que tengo hasta ahora:

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

El problema aquí es que elimina todos los espacios. ¿Soluciones sobre cómo retener espacios?

La salida
fuente
No hago desarrollo de Rails, pero ¿por qué no puedes dejar que Rails se encargue de la desinfección?
Andrew Grimm

Respuestas:

187

Agregue espacios al grupo de caracteres negado:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
jwueller
fuente
4
El espacio vacío no funcionó para mí, por lo que '\ s' también puede ser una opción: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
un poco menos prolijo:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Solo para precisar, esto elimina todas las letras acentuadas y puede que no se adapte a algunos idiomas.
Uelb
@DavidDouglas Eso debería ser \sno\\s
Dex
9

En este caso, usaría el método bang (¡gsub! En lugar de gsub) para limpiar la entrada de forma permanente.

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

Esto evita una situación en la que @seach_query se usa en otra parte del código sin limpiarlo.

nvugteveen
fuente
2
La versión bang devolverá nil si no se ha encontrado ninguna coincidencia. Probablemente no sea el resultado que querría o esperaría. De los documentos "Realiza las sustituciones de String # gsub en su lugar, devolviendo str o nil si no se realizaron sustituciones. Si no se proporciona ningún bloque ni reemplazo, se devuelve un enumerador en su lugar".
dft
2
En su ejemplo, el valor de retorno no se usa, por lo que es bastante irrelevante.
Jaap Haagmans
3

Hubiera utilizado el enfoque de inclusión. En lugar de excluir todo menos los números, solo incluiría números. P.ej

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

Quizás esto funcione para tal caso:

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

Una mejor respuesta (al menos en rubí) es:

@search_query.gsub!(/^(\w|\s*)/,'')
John Doe
fuente
1
Esto eliminará (a) un carácter de una sola palabra o (b) cualquier número de espacios en blanco del principio de la cadena. Completamente ajeno a la pregunta y, por tanto, no es una respuesta.
Sigi
2
cometí un gran error ... no sé lo que estaba pensando: = (
John Doe