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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了局部匹配忽略案例和变音符号相关的知识,希望对你有一定的参考价值。

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

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

  • 圣保罗包含SÃO
  • 纽伦堡包含Nurn
  • Siauliai包含Š

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

答案

我最终使用了joop-eggen建议的正则表达式和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进行搜索。

以上是关于局部匹配忽略案例和变音符号的主要内容,如果未能解决你的问题,请参考以下文章

PayPal IPN 验证和变音符号

Azure 搜索语言分析器和变音符号

LUA:如何正确读取带有重音字母和变音符号的 UFT8 文件名和路径?

彩色变音符号和unicode行为

将单词与特殊字符(é、è、...)进行比较时忽略变音符号

c ++:搜索忽略重音字符