java 比较忽略重音字符的字符串[重复]

icomxhvb  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(139)
    • 此问题在此处已有答案**:

Java. Ignore accents when comparing strings(6个答案)
七年前就关门了。
我想知道是否有一个方法可以比较两个字符串,并且忽略重音,使得"noção"等于"nocao"。它可能是string1.methodCompareIgnoreAccent(string2);

kcrjzv8t

kcrjzv8t1#

您可以使用java Collators来比较测试,忽略重音符号和大小写符号,参见一个简单的示例:

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 and the case
    instance.setStrength(Collator.PRIMARY);

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

文件:JavaDoc

    • 请注意,此排序器还忽略大小写**的差异,即它也将"NOCAO"视为等于"noção"。要创建忽略重音差异但区分大小写的排序器,您可以使用RuleBasedCollator

不要将Collator.setStrength()Collator.setDecomposition()混淆。Collator常量PRIMARYSECONDARYTERTIARYIDENTICAL只能与setStrength()一起使用,而常量NO_DECOMPOSITIONCANONICAL_DECOMPOSITIONFULL_DECOMPOSITION只能与setDecomposition()一起使用。(这段代码的早期版本混淆了这一点,并且只有在NO_DECOMPOSITIONPRIMARY恰好具有相同整数值时才起作用。)

jtw3ybtb

jtw3ybtb2#

没有内置的方法可以做到这一点,因此您必须构建自己的方法:
此解决方案的一部分来自here:这首先将所有重音字符拆分为对应的非重音字符,然后是它们的组合变音符号。然后,您只需删除所有组合变音符号。
然后你的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}+", "");
}

相关问题