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


99

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

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

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


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

Ответы:


189

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

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

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 используется в другом месте кода без его очистки.


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

-3

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

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

1
Это удалит либо (а) одиночный символ слова, либо (б) любое количество пробелов в начале строки. Совершенно не имеет отношения к вопросу и, следовательно, не является ответом.
Сиги

2
совершил большую ошибку .. не знаю, о чем я думал: = (
Джон Доу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.