2015-03-03 121 views
6

我想知道是否有方法比較2個字符串並忽略使「noção」等於「nocao」的重音。 它會像string1.methodCompareIgnoreAccent(string2);比較忽略重音字符的字符串

+2

你看過['Collat​​or'](http://docs.oracle.com/javase/8/docs/api/java/text/Collat​​or.html)嗎? – 2015-03-03 14:05:56

+1

你也可以看看https://stackoverflow.com/questions/1008802/converting-symbols-accent-letters-to-english-alphabet。 – 2015-03-03 14:10:08

+0

我已經寫了一個通過忽略變音符號(不刪除它們)來搜索阿拉伯語文本的類。也許你可以得到想法或以某種方式使用它。 https://gist.github.com/mehdok/e6cd1dfccab0c75ac7a9536c6afac8ff – mehdok 2017-07-19 15:48:23

回答

17

您可以使用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和我不是專家,但你可以谷歌有一些關於它的文章。

+0

謝謝。不知道Collat​​or – alexandre1985 2015-03-03 15:16:12

+0

這是行不通的,它不會打印0.有時它打印-1其他時間1 – alexandre1985 2015-03-03 16:48:54

+1

它的工作原理是,在weston編輯之前獲取代碼。 – 2015-03-03 17:24:26

3

沒有內置的方法來做到這一點,所以你必須建立自己的:

這方面的一個部分解決方案是從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}+", ""); 
}