2009-10-26 4 views
12

더 큰 일련의 작업의 일부로 큰 문자열의 토큰 화 된 부분을 가져 와서 구두점을 제거하거나 단어가 아닌 단어 등을 제거하려고합니다. 초기 시도는 String#gsub을 사용하고 \W 정규 표현식 문자 클래스, 그래서 같은 :Ruby의 문자열 # gsub, unicode 및 단어가 아닌 문자

my_str = "Hello," 
processed = my_str.gsub(/\W/,'') 
puts processed # => Hello 

슈퍼, 슈퍼, 슈퍼 간단합니다. 물론, 지금은 비영어권 문자를 다루기 위해 프로그램을 확장하고 있습니다. Ruby의 \W[^A-Za-z0-9_]과 같은데, 물론 발음 구별 부호 (ü, í 등)가 포함 된 것은 제외됩니다. 그래서, 지금 unpleasent 방법으로 내 이전-간단한 코드 충돌 및 화상 : GSUB

my_str = "Quística." 
processed = my_str.gsub(/\W/,'') 
puts processed # => Qustica 

공지 사항() 친절하게 악센트 "í"문자를 제거했습니다. 이 문제를 해결하기 위해 생각한 한 가지 방법은 더 높은 유니 코드 코드 포인트를 포함하도록 루비의 \ W 화이트리스트를 확장하는 것이지만, 그것들은 엄청나게 많습니다. 그리고 나는 그 중 일부를 놓치고 라인 아래로 문제를 일으킨다는 것을 알고 있습니다. 라틴어 이외의 언어에 대해서도 생각 해보지 않겠습니다 ...). 또 다른 해결책은 내가 구제하고 싶은 모든 것을 블랙리스트에 넣는 것입니다. (구두점, $/%/&/™ 등), 다시 말하지만, 끔찍한 일이 있습니다. 정말로 blacklist-whack-a-mole 게임을 시작하십시오.

아무도이 문제에 대한 원칙적 해결책을 찾았습니까? 아직 발견하지 못한 일부 숨겨진 유니 코드 친화적 인 버전 \W이 있습니까? 감사!

답변

12

UTF-8을 사용하려면 "-Ku"옵션을 사용하여 루비를 실행해야합니다. command-line options에 대한 설명서를 참조하십시오. 이것은 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> 

#! 루비 스크립트의 줄 :

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

가. 이미 UTF-8 모드라고 생각했습니다. 도움이되어 주셔서 감사합니다! –

4

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. 다른 버전의 Ruby를 시험 사용해 보는 데는 rvm이 없습니다. DS.

+0

우우, 정말 반가워. 나는 1.9로 놀아 보지 못했지만, 1.8의 문자 인코딩 단점 중 일부를 다룰 수있어서 기쁩니다. –

+0

일부 내용 만 다루는 것이 아니라 모든 내용을 다룹니다. 그리고 Java, C++, Python, PHP 등 모든 것도 마찬가지입니다. Ruby 1.9의 인코딩 시스템은 ELisp 만 제외하고 아마도 가장 강력하고 가장 완벽한 evar 일 것입니다. 그것은 또한 * 미묘하게 복잡해 보입니다. 그러나 그것은 인코딩이 복잡하기 때문입니다. 자바의 인코딩은 좀 더 단순 해 보일지 모르지만 실제로는'String'을 사용하는 자바를 다소 복잡하게 보았습니까? 아니요, 모든 파서, 디코더, 컴파일러, Regexp 엔진, XML 라이브러리는 실제로'byte []'를 사용합니다. 왜냐하면 *'String'은 너무 단순하기 때문입니다. –

+3

음, 그럼 곧 확인해 보겠습니다. 나는 남은 생애 동안 또 다른 캐릭터 인코딩 문제를 결코 다룰 필요가 없다는 이유로 신장을 교환 할 수 있다면 실제로 그 거래를 고려할 것입니다. 내 말은, 정말 크고 복잡한 인코딩 문제를 잊어 버리십시오. 원래의 질문에서 설명한 것과 같은 어리석은 작은 것들을 고려하면 얼마나 많은 공동 생활 시간으로 우리는이 쓰레기를 처리해야합니까? 나는 당신에게 말할 것이다 : Way. 너무. 많은. –

관련 문제