Wie entferne ich nicht alphanumerische Zeichen aus einer Zeichenfolge und behalte Leerzeichen?

98

Ich möchte einen regulären Ausdruck erstellen, der alle nicht alphanumerischen Zeichen entfernt, aber Leerzeichen behält. Dies dient zum Bereinigen der Sucheingabe, bevor sie die Datenbank erreicht. Folgendes habe ich bisher:

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

Das Problem hierbei ist, dass alle Leerzeichen entfernt werden. Lösungen zur Speicherung von Räumen?

Der Ausgang
quelle
Ich mache keine Rails-Entwicklung, aber warum können Sie Rails nicht die Desinfektion durchführen lassen?
Andrew Grimm

Antworten:

186

Fügen Sie der negierten Zeichengruppe Leerzeichen hinzu:

@search_query = @search_query.gsub(/[^0-9a-z ]/i, '')
jwueller
quelle
4
Der leere Raum hat bei mir nicht funktioniert, daher kann '\ s' auch eine Option sein: @ search_query.gsub (/ [^ 0-9a-z \\ s] / i, '')
David Douglas
6
etwas weniger wortreich:@search_query.gsub!(/[^0-9a-z ]/i, '')
Benjineer
3
Um genau zu sein, werden dadurch alle Buchstaben mit Akzent entfernt und möglicherweise nicht an einige Sprachen angepasst.
Uelb
@ DavidDouglas Das sollte \snicht sein\\s
Dex
9

In diesem Fall würde ich die Bang-Methode (gsub! Anstelle von gsub) verwenden, um den Eingang dauerhaft zu bereinigen.

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

Dies vermeidet eine Situation, in der @seach_query an anderer Stelle im Code verwendet wird, ohne ihn zu bereinigen.

nvugteveen
quelle
2
Die Bang-Version gibt null zurück, wenn nichts übereinstimmt. Wahrscheinlich nicht das Ergebnis, das Sie wollen oder erwarten würden. Aus den Dokumenten "Führt die Ersetzungen von String # gsub an Ort und Stelle aus und gibt str oder nil zurück, wenn keine Ersetzungen durchgeführt wurden. Wenn kein Block und keine Ersetzung angegeben ist, wird stattdessen ein Enumerator zurückgegeben."
dft
2
In seinem Beispiel wird der Rückgabewert nicht verwendet, das ist also ziemlich irrelevant.
Jaap Haagmans
3

Ich hätte den Inklusionsansatz verwendet. Anstatt alle außer Zahlen auszuschließen, würde ich nur Zahlen einschließen. Z.B

@search_query.scan(/[\da-z\s]/i).join
Vadym Tyemirov
quelle
0

Vielleicht funktioniert das für einen solchen Fall:

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

Eine bessere Antwort (zumindest in Rubin) ist:

@search_query.gsub!(/^(\w|\s*)/,'')
John Doe
quelle
1
Dadurch werden entweder (a) ein einzelnes Wortzeichen oder (b) eine beliebige Anzahl von Leerzeichen vom Anfang der Zeichenfolge entfernt. Völlig unabhängig von der Frage und daher keine Antwort.
Sigi
2
machte einen großen Fehler .. weiß nicht, was ich dachte: = (
John Doe