比较忽略重音字符的字符串

时间:2015-03-03 14:04:38

标签: java string compare accent-insensitive

我想知道是否有一种方法比较2个字符串并忽略使“noção”等于“nocao”的重音符号。 它会像string1.methodCompareIgnoreAccent(string2);

2 个答案:

答案 0 :(得分:31)

您可以使用java Collat​​ors来比较忽略重音的测试,请参阅一个简单示例:

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而且我不是它的专家,但你可以谷歌那里有一些关于它的文章。

答案 1 :(得分:5)

没有内置的方法来执行此操作,因此您必须构建自己的方法:

这部分解决方案来自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}+", "");
}