Jak usunąć znaki inne niż alfanumeryczne z ciągu i zachować spacje?

98

Chcę utworzyć wyrażenie regularne, które usuwa wszystkie znaki inne niż alfanumeryczne, ale zachowuje spacje. Ma to na celu wyczyszczenie danych wejściowych wyszukiwania, zanim trafią one do bazy danych. Oto, co mam do tej pory:

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

Problem polega na tym, że usuwa wszystkie spacje. Rozwiązania, jak zachować przestrzeń?

Wyjście
źródło
Nie zajmuję się programowaniem w Railsach, ale dlaczego nie możesz pozwolić Railsom na wyczyszczenie?
Andrew Grimm

Odpowiedzi:

187

Dodaj spacje do zanegowanej grupy znaków:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
jwueller
źródło
4
Puste miejsce nie działało dla mnie, więc '\ s' może być również opcją: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
nieco mniej rozwlekły:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Mówiąc dokładniej, usuwa to wszystkie litery akcentowane i może nie być dostosowane do niektórych języków.
Uelb
@DavidDouglas To powinno być \snie\\s
Dex
9

W tym przypadku użyłbym metody bang (gsub! Zamiast gsub), aby trwale wyczyścić dane wejściowe.

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

Pozwala to uniknąć sytuacji, w której @seach_query jest używane w innym miejscu kodu bez jego czyszczenia.

nvugteveen
źródło
2
Wersja bang zwróci zero, jeśli nic nie zostanie dopasowane. Prawdopodobnie nie wynik, którego chciałbyś lub oczekujesz. Z dokumentacji „Wykonuje podstawienia String # gsub w miejscu, zwracając str lub nil, jeśli nie wykonano żadnych podstawień. Jeśli nie podano żadnego bloku i zastąpienia, zwracany jest moduł wyliczający”.
dft
2
W jego przykładzie wartość zwracana nie jest używana, więc jest to prawie nieistotne.
Jaap Haagmans
3

Zastosowałbym podejście włączające. Zamiast wykluczyć wszystkie oprócz liczb, podałbym tylko liczby. Na przykład

@search_query.scan(/[\da-z\s]/i).join
Vadym Tyemirov
źródło
0

Może to zadziała w takim przypadku:

# do not replace any word characters and spaces
@search_query = @search_query.gsub(/[^\w ]/g, '')
piton4eg
źródło
-3

Lepszą odpowiedzią (przynajmniej w języku rubinowym) jest:

@search_query.gsub!(/^(\w|\s*)/,'')
nieznany z nazwiska
źródło
1
Spowoduje to usunięcie (a) pojedynczego znaku słowa lub (b) dowolnej liczby białych znaków z początku łańcucha. Zupełnie niezwiązane z pytaniem, a zatem bez odpowiedzi.
Sigi
2
popełnił duży błąd ... nie wiem, o czym myślałem: = (
John Doe