W ramach większej serii operacji próbuję wziąć tokeniczne kawałki większego ciągu i pozbyć się interpunkcji, nie-słów, żartów itp. Mój Pierwsza próba wykorzystywane String#gsub
i klasy postaci \W
regexp, tak:Łańcuch Rubiego # gsub, Unicode i znaki nie-słowne
my_str = "Hello,"
processed = my_str.gsub(/\W/,'')
puts processed # => Hello
Super, super, super proste. Oczywiście, teraz rozszerzam swój program, aby poradzić sobie z postaciami spoza alfabetu łacińskiego, a wszystko, co robię, zostało przerwane. Ruby's \W
wydaje się być czymś w rodzaju [^A-Za-z0-9_]
, co oczywiście wyklucza rzeczy za pomocą znaków diakrytycznych (ü, í itd.). Więc teraz moje dawniej-proste wywala kod i spala w nieprzyjemny sposób:
my_str = "Quística."
processed = my_str.gsub(/\W/,'')
puts processed # => Qustica
Zauważ, że gsub() usłużnie usunął znak akcentowany „I”. Jednym ze sposobów rozwiązania tego problemu byłoby rozszerzenie białej listy Ruby \ W tak, aby zawierała wyższe kody Unicode, ale jest ich naprawdę dużo i wiem, że tęsknię za niektórymi i spowoduje problemy na linii (i nie zaczynajmy nawet myśleć o językach niełacińskich ...). Innym rozwiązaniem byłoby umieszczenie na czarnej liście wszystkich rzeczy, których chcę się pozbyć (interpunkcja, $ /%/&/™, itp.), Ale znowu jest ich bardzo dużo, a ja naprawdę nie chcę zacznij grać w blacklist-whack-a-mole.
Czy ktoś tam znalazł zasadnicze rozwiązanie tego problemu? Czy jest jakiś ukryty, przyjazny dla Unicode model \W
, którego jeszcze nie odkryłem? Dzięki!
Gah. Myślałem, że już jestem w trybie UTF-8. To wszystko rozwiązuje, dzięki za pomoc! –