在Ruby中去除非字母数字字符但保留空格

23

尝试更改这个:

"The basketball-player is great! (Kobe Bryant)"

转换成这样:

"the basketball player is great kobe bryant"
尝试过 string.downcase.gsub(/[^a-z ]/, ''),但会移除空格。

1
你应该用空格替换连字符吗? - Ivaylo Strandjev
6个回答

41

您可以简单地添加\s(空格)

string.downcase.gsub(/[^a-z0-9\s]/i, '')


你太棒了!优雅而简单。谢谢 :) - Kyle Carlson
注意:这将删除数字。 - DrewB
2
这将 basketball-player 转换为 basketballplayer - Sarp Kaya
这很有帮助!但我认为我们不需要 /i,因为我们已经将其转换为小写了,对吧? - Eli Rose
清楚地说,我们不需要使用 downcase 才能使其工作,对吗? - Joshua Pinter
OP 想要 downcase,但这可能不是你的情况。如果你不需要 downcase,你可能需要调整正则表达式以允许大写字符。 - gmalette

17

如果您想同时捕获非拉丁字符:

str = "The basketball-player is great! (Kobe Bryant) (ひらがな)"
str.downcase.gsub(/[^[:word:]\s]/, '')
#=> "the basketballplayer is great kobe bryant ひらがな"

12

一些很好的解决方案,但通常最简单的方法是最好的:

string.downcase.gsub /\W+/, ' '

6
所有其他答案也删除了数字。这对于给出的示例是有效的,但实际上并没有回答问题,即如何删除非字母数字字符
string.downcase.gsub(/[^\w\s]/, '')

请注意,这样做不会去除下划线。如果您需要去除,请按照以下操作:
string.downcase.gsub(/[^a-zA-Z\s\d]/, '')

感谢考虑保留数字。作为小建议,\w 已经包括了数字,所以在这个正则表达式中可以省略 \d - Dave Powers
1
好的发现。我更新了答案。我还注意到它没有处理下划线,所以添加了一个替代方案。 - DrewB

1
所有之前的答案都将“basketball-player”转换为“basketballplayer”或完全删除数字,这并不完全符合要求。
以下代码正好符合您的要求:
text.downcase
    .gsub(/[^[:word:]\s]/, ' ') # Replace sequences of non-alphanumerical chars by a single space

希望这能帮助到某个人!

1

a.downcase.gsub(/[^a-z\s]/, "")

注意我在a-z后面添加了空格。如果你想替换所有空格(不仅仅是空格),可以使用gmalette建议的\s。


7
a.downcase.delete('^a-z ') 是一种替代方法。 - steenslag
感谢Ivaylo和@steenslag,我喜欢这个方法,它有助于保持空格。 - Joe

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