В рамках большей серии операций я пытаюсь взять токенизированные куски более крупной строки и избавиться от пунктуации, несвязного словаря и т. Д. В моей первоначальной попытке использовались String#gsub
и регулярное выражение \W
. класс персонажей, вот так:
my_str = "Hello,"
processed = my_str.gsub(/\W/,'')
puts processed # => Hello
Супер, супер, супер просто. Конечно, теперь я расширяю свою программу для работы с нелатинскими символами, и все чертовски плохо. \W
в Ruby кажется чем-то вроде [^A-Za-z0-9_]
, что, конечно, исключает вещи с диакритическими знаками (ü, í и т. Д.). Итак, теперь мой ранее простой код аварийно завершает работу и горит:
my_str = "Quística."
processed = my_str.gsub(/\W/,'')
puts processed # => Qustica
Обратите внимание, что gsub () принудительно удалил акцентированный символ "í". Один из способов исправить это - расширить белый список Ruby \ W, включив в него более высокие кодовые точки Unicode, но их очень много, и я знаю, что я пропущу некоторые из них и вызову проблемы в будущем (и давайте даже не будем думать о нелатинских языках ...). Другим решением было бы занести в черный список все, от чего я хочу избавиться (пунктуация, $ /% / & / ™ и т. Д.), Но, опять же, это очень много, и я действительно не знаю не хочу начинать играть в черный список-удар-моль.
Кто-нибудь нашел принципиальное решение этой проблемы? Есть ли какая-то скрытая, дружественная к Юникоду версия \W
, которую я еще не обнаружил? Спасибо!