Como retiro caracteres não alfanuméricos de uma string e mantenho os espaços?

98

Quero criar um regex que remove todos os caracteres não alfanuméricos, mas mantém espaços. Isso é feito para limpar a entrada de pesquisa antes de chegar ao banco de dados. Aqui está o que tenho até agora:

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

O problema aqui é que remove todos os espaços. Soluções sobre como reter espaços?

A saída
fonte
Eu não faço o desenvolvimento do Rails, mas por que você não pode deixar o Rails fazer a limpeza?
Andrew Grimm

Respostas:

187

Adicione espaços ao grupo de caracteres negado:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
Jwueller
fonte
4
O espaço vazio não funcionou para mim, então '\ s' também pode ser uma opção: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
um pouco menos prolixo:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Para ser mais preciso, isso remove todas as letras acentuadas e pode não ser adaptado para alguns idiomas.
Uelb
@DavidDouglas Isso \snão deveria ser\\s
Dex
9

Nesse caso, eu usaria o método bang (gsub! Em vez de gsub) para limpar a entrada permanentemente.

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

Isso evita uma situação em que @seach_query é usado em outro lugar no código sem limpá-lo.

nvugteveen
fonte
2
A versão bang retornará nulo se nada for correspondido. Provavelmente não é o resultado que você deseja ou espera. Dos documentos "Executa as substituições de String # gsub no lugar, retornando str ou nil se nenhuma substituição foi realizada. Se nenhum bloco e nenhuma substituição for fornecido, um enumerador será retornado em seu lugar."
dft
2
Em seu exemplo, o valor de retorno não é usado, então isso é bastante irrelevante.
Jaap Haagmans
3

Eu teria usado a abordagem de inclusão. Em vez de excluir tudo, exceto os números, eu incluiria apenas números. Por exemplo

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

Talvez isso funcione para esse caso:

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

Uma resposta melhor (pelo menos em rubi) é:

@search_query.gsub!(/^(\w|\s*)/,'')
John Doe
fonte
1
Isso removerá (a) um caractere de palavra única ou (b) qualquer número de espaços em branco do início da string. Completamente não relacionado à pergunta e, portanto, não é uma resposta.
Sigi
2
cometi um grande erro .. não sei o que estava pensando: = (
John Doe