#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. допустил большую ошибку .. не знаю, о чем я думал: = (