局部匹配忽略案例和变音符号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了局部匹配忽略案例和变音符号相关的知识,希望对你有一定的参考价值。
我有一个句子列表,需要检查其中是否存在某些单词。我需要忽略大小写,重音符号,变音符号,连字符等。
例如,以下所有搜索都应返回true:
- 圣保罗包含SÃO
- 纽伦堡包含Nurn
- Siauliai包含Š
我知道java.text.Collator和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进行搜索。
以上是关于局部匹配忽略案例和变音符号的主要内容,如果未能解决你的问题,请参考以下文章