Як я знімаю не буквено-цифрові символи з рядка та зберігаю пробіли?


98

Я хочу створити регулярний вираз, який видаляє всі символи, що не містять букв, але зберігає пробіли. Це для очищення вхідного пошуку, перш ніж він потрапить на db. Ось що я маю досі:

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

Проблема тут полягає в тому, що він видаляє всі пробіли. Рішення про те, як зберегти пробіли?


Я не займаюся розробкою Rails, але чому ви не можете дозволити Rails зробити санітарну обробку?
Ендрю Грімм

Відповіді:


187

Додайте пробіли до групи заперечених символів:

@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
Точно для цього вилучіть усі наголошені букви та може не бути адаптованим до деяких мов.
Уельб

@DavidDouglas Це повинно бути \sНЕ\\s
Dex

9

У цьому випадку я використовую метод чуття (gsub! Замість gsub) для того, щоб очистити вхід постійно.

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

Це дозволяє уникнути ситуації, коли @seach_query використовується в іншому місці коду без його очищення.


2
Версія чубу повернеться до нуля, якщо нічого не знайдено. Можливо, це не той результат, якого б ви хотіли чи очікували. З документів "Виконує заміну String # gsub на місці, повертаючи str або nil, якщо не було виконано підстановок. Якщо не встановлено жодного блоку та заміни, замість нього повертається нумератор."
dft

2
У його прикладі повернене значення не використовується, тому це майже не має значення.
Jaap Haagmans

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
Це дозволить видалити або (а) символ одного слова, або (b) будь-яку кількість пробілів з початку рядка. Повністю не пов’язаний із запитанням, а отже, не відповіддю.
Сігі

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