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

#ruby-on-rails #ruby #regex #ruby-on-rails-3

#ruby-on-rails #ruby #регулярное выражение #ruby-on-rails-3

Вопрос:

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

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

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

Комментарии:

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

Ответ №1:

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

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

Комментарии:

1. Пустое пространство у меня не сработало, поэтому ‘s’ также может быть вариантом: @search_query.gsub(/[^0-9a-z s] / i, «)

2. немного менее многословный: @search_query.gsub!(/[^0-9a-z ]/i, '')

3. Просто для точности, это удаляет все буквы с ударением и может не быть адаптировано к некоторым языкам.

4. @DavidDouglas Этого не должно быть s \s

Ответ №2:

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

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

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

Комментарии:

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

2. В его примере возвращаемое значение не используется, так что это в значительной степени не имеет значения.

Ответ №3:

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

 @search_query.scan(/[da-zs]/i).join
  

Ответ №4:

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

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

Ответ №5:

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

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

Комментарии:

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

2. допустил большую ошибку .. не знаю, о чем я думал: = (