2017-08-18 44 views
-1

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

例如,下面所有的搜索应该返回true:

  • 圣保罗包含SÃO
  • 纽伦堡包含Nurn酒店
  • 希奥利艾包含Š

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

+1

使用归一化器将NKD分解为基本字母并结合变音符号,您可以删除变音符号'replaceAll(“\\ p {M}”,“”);'然后全部都应该在那里。 –

回答

1

我最终使用正则表达式和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来搜索它。

+0

显示出解决的代码表示赞赏。会帮助别人。 –