Как удалить из строки не буквенно-цифровые символы и оставить пробелы?

99

Я хочу создать регулярное выражение, которое удаляет все символы, отличные от буквенно-цифровых, но сохраняет пробелы. Это необходимо для очистки ввода поиска до того, как он попадет в базу данных. Вот что у меня есть на данный момент:

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

Проблема здесь в том, что он удаляет все пробелы. Решения о том, как сохранить пробелы?

Выход
источник
Я не занимаюсь разработкой на Rails, но почему вы не можете позволить Rails выполнить очистку?
Эндрю Гримм

Ответы:

189

Добавьте пробелы к отрицательной группе символов:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
Jwueller
источник
4
Пустое пространство не сработало для меня, поэтому '\ s' также может быть вариантом: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
Дэвид Дуглас,
6
немного менее многословен:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Точнее говоря, это удаляет все буквы с диакритическими знаками и может не быть адаптировано для некоторых языков.
Uelb
@DavidDouglas Это должно быть \sне\\s
Dex
9

В этом случае я бы использовал метод bang (gsub! Вместо gsub), чтобы навсегда очистить ввод.

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

Это позволяет избежать ситуации, когда @seach_query используется в другом месте кода без его очистки.

Nvugteveen
источник
2
Версия bang вернет nil, если ничего не найдено. Вероятно, не тот результат, которого вы хотели или ожидали. Из документации «Выполняет подстановки String # gsub на месте, возвращая str или nil, если подстановки не выполнялись. Если не заданы ни блок, ни замена, вместо этого возвращается перечислитель».
dft
2
В его примере возвращаемое значение не используется, так что это не имеет значения.
Яап Хаагманс,
3

Я бы использовал подход включения. Вместо того, чтобы исключать все, кроме чисел, я бы включил только числа. Например

@search_query.scan(/[\da-z\s]/i).join
Вадим Темиров
источник
0

Возможно, это сработает в таком случае:

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')
piton4eg
источник
-3

Лучший ответ (по крайней мере, в рубине):

@search_query.gsub!(/^(\w|\s*)/,'')
Джон Доу
источник
1
Это удалит либо (а) одиночный символ слова, либо (б) любое количество пробелов в начале строки. Совершенно не имеет отношения к вопросу и, следовательно, не является ответом.
Сиги
2
совершил большую ошибку .. не знаю, о чем я думал: = (
Джон Доу