我必须测试一个字符串是否包含在另一个字符串中但不考虑大小写或重音符号(在这种情况下为法语口音)。
例如,如果我在字符串true
中搜索"rhone"
,则该函数必须返回"Vallée du Rhône"
。
Collator对于使用重音进行字符串比较非常有用,但不提供contains
函数。
有没有简单的方法来完成这项工作?正则表达式可能吗?
其他信息:
我只需要一个true
/ false
返回值,我不关心参考字符串中匹配项的数量或测试字符串的位置。
答案 0 :(得分:18)
您可以使用Normalizer将字符串缩减为可以直接比较的精简版本。
编辑要清楚
String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
String ascii = normalized.replaceAll("[^\\p{ASCII}]", "");
答案 1 :(得分:13)
查看Normalizer。
你应该用Normalizer.Form.NFD
作为你的第二个参数来调用它。
所以,那将是:
Normalizer.normalize(yourinput, Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
.toLowerCase()
.contains(yoursearchstring)
如果匹配则返回true(当然,否则返回false)
答案 2 :(得分:3)
这个怎么样?
private static final Pattern ACCENTS_PATTERN = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
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"));
}
答案 3 :(得分:0)
执行此操作的常规方法是将两个字符串转换为小写而不使用重音符,然后使用标准的“包含”。