我有一個句子列表,需要檢查某些單詞是否存在於其中。我需要忽略大小寫,重音,音調符號,連字等部分匹配忽略大小寫和變音符號
例如,下面所有的搜索應該返回true:
- 聖保羅包含SÃO
- 紐倫堡包含Nurn酒店
- 希奧利艾包含Š
我知道java.text.Collator和java.text.Normalizer類,但我找不到部分匹配的方法。
我有一個句子列表,需要檢查某些單詞是否存在於其中。我需要忽略大小寫,重音,音調符號,連字等部分匹配忽略大小寫和變音符號
例如,下面所有的搜索應該返回true:
我知道java.text.Collator和java.text.Normalizer類,但我找不到部分匹配的方法。
我最終使用正則表達式和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來搜索它。
顯示出解決的代碼表示讚賞。會幫助別人。 –
使用歸一化器將NKD分解爲基本字母並結合變音符號,您可以刪除變音符號'replaceAll(「\\ p {M}」,「」);'然後全部都應該在那裏。 –