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ń?


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

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.


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

0

Może to zadziała w takim przypadku:

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

-3

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.