2014-11-06 4 views
1

나는 List[String]에 유니 코드 문자가 있습니다.scala 문자열. 유니 코드 포함

val languages = List("Deutsch","english","español") 
val results = languages.filter(_.contains("espan")) 
results: List[String] = List() 

그러나 나는 List(español)을 찾고 싶습니다. 독일의 ä, ö, ü 같은 문자에 대해 이것을 구현하는 좋은/빠른 방법이 있습니까? 이처럼

+0

정확히 무엇을 구현합니까? 부분 일치? 유니 코드 문자를 영어 alplhabet로 번역 하시겠습니까? 'List ("español")'을 반환해야하는시기와 반환해야하는시기는 언제입니까? –

+0

나는'espan'과'españ'에 돌려주고 싶습니다. – elmalto

+0

이것 좀보세요 : http://stackoverflow.com/questions/1008802/converting-symbols-accent-letters-to-english-alphabet – dhg

답변

0

:

scala> import java.text.Normalizer 
import java.text.Normalizer 

scala> def removeDiacritics(in: String) : String = { 
    |  // Separate accents from characters and then remove non-unicode characters 
    |  Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("\\p{M}", "") 
    | } 
removeDiacritics: (in: String)String 

scala> val languages = List("Deutsch","english","español") 
languages: List[String] = List(Deutsch, english, español) 

scala> val results = languages.map(removeDiacritics).filter(_.contains("espan")) 
results: List[String] = List(espanol) 

scala> 

솔루션은 여기 당신이 contains("espan")을하기 전에 목록을 매핑에 사용할 수있는 "removeDiacritics"기능을 제공합니다. 패턴 \p{M}은 발음 구별 부호가 아닌 유니 코드가 아닌 것과 일치하는 반면 정규화 기는 알파벳 문자에서 발음 구별 기호를 분리한다는 것을 이해해야합니다.

이것의 한 가지 부작용은 발음 구별 부호가없는 문자열이 반환된다는 것입니다. 당신은 그것을 원하지 않을 지 모르지만 발음 구별없이 비교를 할 수있게되었으므로 원본을 돌려주기 위해 연습 문제로 남겨 둘 것입니다.