局部匹配忽略案例和变音符号

时间:2017-08-18 21:28:35

标签: java unicode internationalization

我有一个句子列表,需要检查其中是否存在某些单词。我需要忽略大小写,重音符号,变音符号,连字符等。

例如,以下所有搜索都应返回true:

  • 圣保罗包含SÃO
  • Nürnberg包含Nurn
  • Siauliai包含Š

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

1 个答案:

答案 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 进行搜索。