Как часть более крупной серии операций, я пытаюсь использовать токенизированные фрагменты большей строки и избавляться от пунктуации, не-слова 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
, которую я еще не обнаружил? Спасибо!