2009-10-26 15 views
12

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!

Odpowiedz

12

Musisz uruchomić ruby ​​za pomocą opcji "-Ku", aby użyć UTF-8. Zobacz dokumentację dla command-line options. Oto, co się dzieje, gdy robię to z 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> 

Możesz również umieścić go na #! wiersz w twoim rubinowym skrypcie:

#!/usr/bin/ruby -Ku 
+0

Gah. Myślałem, że już jestem w trybie UTF-8. To wszystko rozwiązuje, dzięki za pomoc! –

4

Chciałbym tylko dodać, że w 1.9.1 działa domyślnie.

$ 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. Nic nie pobije rvm do wypróbowania różnych wersji Rubiego. DS.

+0

Oooo, z pewnością miło to zobaczyć. Nie grałem jeszcze z wersją 1.9, ale cieszę się, że odnosi się ona do niektórych dziwactw kodujących kod 1.8. –

+0

Nie odnosi się tylko do niektórych z nich, ale odnosi się do nich wszystkich. I wszystkie Java, C++, Python, PHP, ... też. System kodowania Ruby 1.9 jest prawdopodobnie najpotężniejszym, najbardziej kompletnym narzędziem, z możliwym wyjątkiem tylko ELisp. Również * wygląda * niesamowicie skomplikowane, ale to dlatego, że kodowanie * jest * skomplikowane. Kodowanie Java może * wyglądać * prościej, ale czy widziałeś kiedykolwiek średnio złożoną część Javy, która faktycznie * używa * 'String'? Nie, wszystkie parsery, dekodery, kompilatory, silniki Regexp, biblioteki XML faktycznie używają 'byte []', dokładnie * ponieważ * 'String' jest zbyt uproszczone. –

+3

Cóż, na pewno muszę to wkrótce sprawdzić. Przysięgam, gdybym mógł wymieniać, powiedzmy, nerkę, że przez resztę życia nie będę miał do czynienia z innym zagadnieniem kodowania znaków, mógłbym rozważyć umowę. To znaczy, zapomnij o wszystkich naprawdę dużych i skomplikowanych zagadnieniach kodowania - biorąc pod uwagę głupie maluchy, takie jak te, które opisałem w oryginalnym pytaniu, ile kolektywnych godzin naszego życia zmarnowaliśmy na radzenie sobie z tym gównem? Powiem ci: Way. Także. Wiele. –