包含与整理器
Posted
技术标签:
【中文标题】包含与整理器【英文标题】:contains with collator 【发布时间】:2012-02-03 11:07:54 【问题描述】:我必须测试一个字符串是否包含在另一个字符串中,但不考虑大小写或重音(在这种情况下是法语重音)。
例如,如果我在字符串"Vallée du Rhône"
中搜索"rhone"
,该函数必须返回true
。
整理器可用于字符串与重音的比较,但不提供contains
函数。
有没有简单的方法来完成这项工作?也许是一个正则表达式?
其他信息:
我只需要一个true
/ false
返回值,我不关心匹配数或测试字符串在引用字符串中的位置。
【问题讨论】:
不幸的是,java.util.regex 不支持排序序列,否则您确实可以尝试匹配\brh[[=o=]]ne\b
...
【参考方案1】:
您可以使用Normalizer 将字符串缩减为可以直接比较的精简版本。
编辑:要清楚
String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
String ascii = normalized.replaceAll("[^\\pASCII]", "");
【讨论】:
【参考方案2】:看看Normalizer。
您应该使用Normalizer.Form.NFD
作为第二个参数来调用它。
所以,那就是:
Normalizer.normalize(yourinput, Normalizer.Form.NFD)
.replaceAll("\\pInCombiningDiacriticalMarks+", "")
.toLowerCase()
.contains(yoursearchstring)
如果匹配则返回真(当然,否则返回假)
【讨论】:
这不会将 'è' 分解为 'e`' 吗?这将使 contains() 失败,除非重音字符始终是字符串的最后一个。【参考方案3】:这个怎么样?
private static final Pattern ACCENTS_PATTERN = Pattern.compile("\\pInCombiningDiacriticalMarks+");
public static boolean containsIgnoreCaseAndAccents(String haystack, String needle)
final String hsToCompare = removeAccents(haystack).toLowerCase();
final String nToCompare = removeAccents(needle).toLowerCase();
return hsToCompare.contains(nToCompare);
public static String removeAccents(String string)
return ACCENTS_PATTERN.matcher(Normalizer.normalize(string, Normalizer.Form.NFD)).replaceAll("");
public static void main(String[] args)
System.out.println(removeAccents("Vallée du Rhône"));
System.out.println(removeAccents("rhone"));
System.out.println(containsIgnoreCaseAndAccents("Vallée du Rhône", "rhone"));
【讨论】:
【参考方案4】:执行此操作的正常方法是将两个字符串都转换为不带重音符号的小写,然后使用标准的“包含”。
【讨论】:
以上是关于包含与整理器的主要内容,如果未能解决你的问题,请参考以下文章