web-dev-qa-db-ja.com

Javaアクセントを無視した文字列検索

入力文字列を受け取り、指定された入力と何らかの方法で一致しないすべてのオブジェクトをフィルターで除外するフィルター関数をアプリケーションに記述しようとしています。これを行う最も簡単な方法は、Stringのcontainsメソッドを使用することです。つまり、オブジェクト(オブジェクトのString変数)にフィルターで指定された文字列が含まれているかどうかを確認するだけですが、これはアクセントを考慮しません。

問題のオブジェクトは基本的にPersonsであり、一致させようとしている文字列は名前です。したがって、たとえば、誰かがJoaoを検索した場合、Joáoが結果セットに含まれることを期待します。私はすでにアプリケーションでCollat​​orクラスを使用して名前で並べ替えましたが、比較できるため、うまく機能します。つまり、UKロケールを使用するとbの前になりますがaの後になります。ただし、aとáを比較すると、等しくないため、明らかに0は返されません。

それで、誰かが私がこれをどのように行うことができるかについて何か考えを持っていますか?

33
DaveJohnston

Java.text.Normalizer そして 発音区別符号 を取り除くための正規表現のショット。

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

次のように使用できます。

String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao
83
BalusC

Collat​​or does aとáに対して0を返します。if発音区別符号を無視するように構成します。

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"、 "á")はtrueになります

4
Benny Bottema

分音記号を無視して(削除せずに)アラビア語のテキストを検索するためのクラスを作成しました。多分あなたはアイデアを得るか、それを何らかの方法で使うことができます。

DiacriticInsensitiveSearch.Java

0
mehdok