web-dev-qa-db-ja.com

アクセント付き文字を無視して文字列を比較する

2つの文字列を比較し、アクセントを無視して「noção」を「nocao」に等しくするメソッドがあるかどうか知りたい。 string1.methodCompareIgnoreAccent(string2);のようになります。

17
alexandre1985

Java Collat​​orを使用して、アクセントを無視してテストを比較できます。簡単な例を参照してください:

import Java.text.Collator;

/**
 * @author Kennedy
 */
public class SimpleTest
{

  public static void main(String[] args)
  {
    String a = "nocao";
    String b = "noção";

    final Collator instance = Collator.getInstance();

    // This strategy mean it'll ignore the accents
    instance.setStrength(Collator.NO_DECOMPOSITION);

    // Will print 0 because its EQUAL
    System.out.println(instance.compare(a, b));
  }
}

ドキュメント: JavaDoc

私はほんの少しのCollat​​orsを使用していて、私はその専門家ではないので、詳細には説明しませんが、それに関するいくつかの記事をググることはできます。

36

これを行うための組み込みメソッドはないため、独自のメソッドを作成する必要があります。

これの一部は、解決策です here :これは、最初にすべてのアクセント付き文字をdeAccentedの対応する文字に分割し、その後に発音区別記号を組み合わせます。次に、結合している発音区別符号をすべて削除します。 https://stackoverflow.com/a/1215117/4095834 も参照してください

そして、equalsメソッドは次のようになります。

import Java.text.Normalizer;
import Java.text.Normalizer.Form;

public boolean equals(Object o) {
    // Code omitted
    if (yourField.equals(removeAccents(anotherField))) {
        return true;
    }
}

public static String removeAccents(String text) {
    return text == null ? null : Normalizer.normalize(text, Form.NFD)
            .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
5
intrigus