2017-08-18 43 views
-1

我有一個句子列表,需要檢查某些單詞是否存在於其中。我需要忽略大小寫,重音,音調符號,連字等部分匹配忽略大小寫和變音符號

例如,下面所有的搜索應該返回true:

  • 聖保羅包含SÃO
  • 紐倫堡包含Nurn酒店
  • 希奧利艾包含Š

我知道java.text.Collat​​or和java.text.Normalizer類,但我找不到部分匹配的方法。

+1

使用歸一化器將NKD分解爲基本字母並結合變音符號,您可以刪除變音符號'replaceAll(「\\ p {M}」,「」);'然後全部都應該在那裏。 –

回答

1

我最終使用正則表達式和java.text.Normalizer的組合由喬普-埃根的建議:

public static final Pattern DIACRITICS_AND_MODIFIERS = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]"); 

... 

String text = Normalizer.normalize(input, Normalizer.Form.NFKD); 
text = DIACRITICS_AND_MODIFIERS.matcher(text).replaceAll("").toLowerCase(); 

我用NFKD代替NKD因爲它分解特殊情況下,像結紮線( (ffi)羅馬數字()和上標()。上面的代碼仍然會出現一些錯誤情況(例如,),但這些在我的語言環境(葡萄牙語)中並不重要。

然後我將搜索項和要搜索的文本標準化並使用String.contains來搜索它。

+0

顯示出解決的代碼表示讚賞。會幫助別人。 –