文字列から英数字以外の文字を削除してスペースを保持するにはどうすればよいですか?


98

英数字以外のすべての文字を削除し、スペースは保持する正規表現を作成したいと考えています。これは、dbに到達する前に検索入力をクリーンアップするためです。ここに私がこれまで持っているものがあります:

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

ここでの問題は、すべてのスペースが削除されることです。スペースを保持する方法に関するソリューション?


Railsの開発は行っていませんが、なぜRailsにサニタイズを実行させないのですか?
Andrew Grimm、

回答:


186

否定された文字グループにスペースを追加します。

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

4
空のスペースは私にとっては機能しなかったので、 '\ s'もオプションである可能性があります:@ search_query.gsub(/ [^ 0-9a-z \\ s] / i、 '')
David Douglas

6
少し@search_query.gsub!(/[^0-9a-z ]/i, '')
言い回しが

3
正確に言うと、これはすべてのアクセント付き文字を削除し、一部の言語には適応しない場合があります。
Uelb 2015年

@DavidDouglasすべきで\sはない\\s
Dex

9

この場合、入力を永続的にクリーンアップするために、bangメソッド(gsubではなくgsub!)を使用します。

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

これにより、@ seach_queryがクリーンアップされずにコードの他の場所で使用される状況が回避されます。


2
何も一致しなかった場合、bangバージョンはnilを返します。おそらくあなたが望んだり期待したりする結果ではないでしょう。ドキュメントから「String#gsubの置換を実行し、strを返すか、置換が行われなかった場合はnilを返します。ブロックも置換も指定されていない場合は、代わりに列挙子が返されます。」
dft d'an

2
彼の例では戻り値は使用されていないため、ほとんど関係ありません。
Jaap Haagmans 2017年

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
これにより、(a)単一の単語文字または(b)文字列の先頭から任意の数の空白が削除されます。質問とはまったく関係がないため、回答ではありません。
Sigi

2
大きな間違いを犯した..私が何を考えていたかわからない:=(
John Doe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.