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

Ste*_*ick 12 ruby regex unicode

作为更大系列操作的一部分,我正在尝试使用更大字符串的标记化块并摆脱标点符号,非单词gobbledygook等.我使用的初始尝试String#gsub和正则\W表达式字符类,如下所示:

my_str = "Hello,"
processed = my_str.gsub(/\W/,'')
puts processed # => Hello
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

wde*_*aum 12

您需要使用"-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> 
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/ruby -Ku
Run Code Online (Sandbox Code Playgroud)