2010-03-07 3 views
26

입력 문자열을 받아 어떤 식 으로든 주어진 입력과 일치하지 않는 모든 객체를 필터링하는 필터 함수를 작성하려고합니다. 이를 수행하는 가장 쉬운 방법은 String의 contains 메소드를 사용하는 것입니다. 즉, 객체 (객체의 String 변수)에 필터에 지정된 문자열이 포함되어 있는지 확인하지만 액센트는 고려하지 않습니다.악센트를 무시하고 자바 문자열 검색

문제의 개체는 기본적으로 사람이고 일치하려는 문자열은 이름입니다. 예를 들어 누군가가 Joao를 검색하면 Joao가 결과 세트에 포함될 것으로 기대합니다. 이미 응용 프로그램에서 Collator 클래스를 사용하여 이름순으로 정렬했으며 비교할 수 있기 때문에 잘 작동합니다 (예 : 영국 로캘 사용). b는 b 앞에 있지만 a 뒤에옵니다. 그러나 obvisouly 당신이 a와 a를 비교하면 0을 반환하지 않습니다. 왜냐하면 그것들은 동등하지 않기 때문입니다.

그럼 어떻게 할 수 있을지 아무도 모른다.

+0

가능한 [Java. 문자열을 비교할 때 악센트를 무시하십시오.] (0120-13995) – Barett

답변

69

java.text.Normalizer을 사용하고 diacritics을 없애려면 정규식을 사용하십시오. 당신이로 사용할 수

public static String removeDiacriticalMarks(String string) { 
    return Normalizer.normalize(string, Form.NFD) 
     .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
} 

은 다음과 같습니다

String value = "Joáo"; 
String comparisonMaterial = removeDiacriticalMarks(value); // Joao 
+1

나는 내 대답을 철회합니다! 절대 java.text.Normalizer를 보지 말고 팁을 주셔서 감사합니다. – Brabster

+0

감사합니다. 정확하게 필요한 것. – DaveJohnston

+0

이것은 훌륭합니다. 내가 성공적으로 비 ASCII 문자열에 정규식 일치를하려고했습니다. 정규화가 가장 좋은 방법 인 것 같습니다. – ankimal

2

조합기 는과에 대한 반환 0을 수행하면 분음 부호 무시하도록 구성 경우 :

public boolean isSame(String a, String b) { 
    Collator insenstiveStringComparator = Collator.getInstance(); 
    insenstiveStringComparator.setStrength(Collator.PRIMARY); 
    // Collator.PRIMARY also works, but is case senstive 
    return insenstiveStringComparator.compare(a, b) == 0; 
} 

isSame을 ("a", "á")는 현재 사실로 나타납니다

0

분음 부호를 무시하여 물마루 아랍어 텍스트를 검색하기위한 클래스를 작성했습니다 (제거하지 않음). 어쩌면 당신은 아이디어를 얻거나 그것을 어떤 식 으로든 사용할 수 있습니다.

DiacriticInsensitiveSearch.java