我有一个句子列表,需要检查其中是否存在某些单词。我需要忽略大小写,重音符号,变音符号,连字符等。
例如,以下所有搜索都应返回true:
我知道java.text.Collator和java.text.Normalizer类,但我找不到部分匹配的方法。
答案 0 :(得分:1)
我最终使用了joop-eggen建议的regex和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 )罗马数字(Ⅸ)和上标(⁵)。上面的代码遗漏了一些极端情况(例如Æ和ł),但这些在我的Locale(葡萄牙语)中并不重要。
然后我将搜索词和要搜索的文本标准化,并使用 String.contains 进行搜索。