如何从字符串中去除非字母数字字符并保留空格?

114
我想创建一个正则表达式,以删除所有非字母数字字符但保留空格。这是为了在输入进入数据库之前清理搜索输入。以下是我目前的代码:
@search_query = @search_query.gsub(/[^0-9a-z]/i, '')

问题在于它移除了所有的空格。有解决方案可以保留空格吗?


我不从事Rails开发,但为什么你不能让Rails来进行净化处理呢? - Andrew Grimm
5个回答

206

在否定字符组中添加空格:

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

6
对我而言,空格并不能起到作用,所以 '\s' 也许是一个选项:@search_query.gsub(/[^0-9a-z\s]/i, '')。 - David Douglas
6
@search_query.gsub!(/[^0-9a-z ]/i, '') 稍微简洁一些。 - Benjineer
4
只是为了明确,这会删除所有带重音的字母,可能不适用于某些语言。 - Uelb
@DavidDouglas 应该是 \s 而不是 \\s - Dex

14

在这种情况下,我会使用叹号方法(gsub! 而不是 gsub)来永久清除输入内容。

#permanently filter all non-alphanumeric characters, except _
@search_query.gsub!(/\W/,'')
这将避免在代码的其他地方使用未经清理的@seach_query情况发生。

这将防止在代码其他地方使用未经清理的 @search_query。


2
感叹号版本将在没有匹配的情况下返回nil。这可能不是您想要或期望的结果。从文档中可以看到:“在原地执行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
一个更好的答案(至少在Ruby中)是:
@search_query.gsub!(/^(\w|\s*)/,'')

2
这将从字符串的开头删除单词字符或任意数量的空格。与问题完全无关,因此不是答案。 - Sigi
2
犯了一个大错误..不知道当时在想什么 :=( - John Doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接