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


98

我想创建一个删除所有非字母数字字符但保留空格的正则表达式。这是在到达数据库之前清除搜索输入。这是我到目前为止的内容:

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

这里的问题是它删除了所有空格。解决方案如何保留空间?


我不进行Rails开发,但是为什么不让Rails进行消毒呢?
安德鲁·格林

Answers:


187

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

@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, '')
罗word

3
准确地说,这会删除所有带重音的字母,并且可能不适用于某些语言。
Uelb 2015年

@DavidDouglas这应该是\s\\s
地塞米松

9

在这种情况下,我将使用bang方法(用gsub!代替gsub)来永久清除输入。

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

这样可以避免在代码的其他地方使用@seach_query而不清理它的情况。


2
如果没有任何匹配,则爆炸版本将返回nil。可能不是您想要或期望的结果。来自docs “在适当位置执行String#gsub的替换,如果未执行替换,则返回str或nil。如果未执行块且未提供替换,则返回枚举器。”
dft

2
在他的示例中,未使用返回值,因此这几乎无关紧要。
哈普曼斯

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

1
这将删除字符串开头的(a)一个单词字符或(b)任何数量的空格。与问题完全无关,因此不是答案。
西吉

2
犯了一个大错误..不知道我在想什么:=(
约翰·多伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.