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
, которую я еще не обнаружил? Спасибо!
Ответы
Ответ 1
Вам нужно запустить ruby с опцией -Ku, чтобы использовать 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>
Вы также можете поместить его на #! строка в рубине script:
#!/usr/bin/ruby -Ku
Ответ 2
Я хотел бы добавить, что в 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. Ничто не сравнится rvm для тестирования разных версий Ruby. DS.