Ruby的String#gsub,unicode和非单词字符

作为更大系列操作的一部分,我正在尝试使用更大字符串的标记块并摆脱标点符号,非字gobbledygook等。我的初始尝试使用String#gsub\W regexp字符类,如所以:

 my_str = "Hello," processed = my_str.gsub(/\W/,'') puts processed # => Hello 

超级,超级,超级简单。 当然,现在我正在扩展我的程序以处理非拉丁字符,并且所有的东西都被打破了。 Ruby的\W似乎就像[^A-Za-z0-9_] ,当然,它排除了变音符号(ü,í等)的东西。 所以,现在我以前简单的代码以不愉快的方式崩溃和烧毁:

 my_str = "Quística." processed = my_str.gsub(/\W/,'') puts processed # => Qustica 

请注意,gsub()必须删除带重音的“í”字符。 我想到解决这个问题的一种方法是扩展Ruby的\ W白名单以包含更高的Unicode代码点,但是它们中有很多,我知道我会错过一些并导致问题(并且我们甚至没有开始考虑非拉丁语言……)。 另一个解决方案是将我想要摆脱的所有东西列入黑名单(标点符号,$ /%/&/™等),但是,再次,有很多这样的东西,我真的不想开始玩黑名单-敲击一个痣。

有没有人找到这个问题的原则解决方案? 是否有一些我尚未发现的隐藏的,Unicode友好的\W版本? 谢谢!

您需要使用“-Ku”选项运行ruby以使其使用UTF-8。 有关命令行选项,请参阅文档。 当我用irb执行此操作时会发生这种情况:

 % irb -Ku irb(main):001:0> my_str = "Quística." => "Quística." irb(main):002:0> processed = my_str.gsub(/\W/,'') => "Quística" irb(main):003:0> 

你也可以把它放在#! ruby脚本中的行:

 #!/usr/bin/ruby -Ku 

我想在1.9.1中添加它默认工作。

 $ irb ruby-1.9.1-p243 > my_str = "Quística." => "Quística." ruby-1.9.1-p243 > processed = my_str.gsub(/\W/,'') => "Quística" ruby-1.9.1-p243 > processed.encoding => # 

PS。 尝试不同版本的Ruby没有什么比rvm更好的了。 DS。