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

时间:2009-10-26 22:42:50

标签: ruby regex unicode

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

\W
超级,超级,超级简单。当然,现在我正在扩展我的程序来处理非拉丁字符,而且所有的东西都被打破了。 Ruby的my_str = "Hello," processed = my_str.gsub(/\W/,'') puts processed # => Hello 似乎与\W类似,当然,它排除了变音符号(ü,í等)的内容。所以,现在我以前简单的代码以不愉快的方式崩溃和烧毁:

[^A-Za-z0-9_]

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

有没有人找到这个问题的原则解决方案?是否有一些隐藏的,Unicode友好的my_str = "Quística." processed = my_str.gsub(/\W/,'') puts processed # => Qustica 版本尚未发现?谢谢!

2 个答案:

答案 0 :(得分:12)

您需要使用“-Ku”选项运行ruby以使其使用UTF-8。请参阅command-line options的文档。当我用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 :(得分:4)

我想在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
=> #<Encoding:UTF-8>

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