我有一个类将所有土耳其符号替换为类似的拉丁符号,并将结果传递给搜索者。
这些是符号替换的方法
@Override
String replaceTurkish(String words) {
if (checkWithRegExp(words)) {
return words.toLowerCase().replaceAll("ç", "c").replaceAll("ğ", "g").replaceAll("ı", "i").
replaceAll("ö", "o").replaceAll("ş", "s").replaceAll("ü", "u");
} else return words;
}
public static boolean checkWithRegExp(String word){
Pattern p = Pattern.compile("[öçğışü]");
Matcher m = p.matcher(word);
return m.matches();
}
但是这总是会返回未经修改的单词声明。
我做错了什么?
提前致谢!
答案 0 :(得分:6)
根据Java 7 api,Matcher.matches()
尝试将整个区域与模式匹配。
你的模式是“[öçğışü]”,regex101.com(一个很棒的资源)说匹配
列表中的单个字符öçğışü字面
也许您可能已经看到了问题。除了一个土耳其字符之外,你的正则表达式不会匹配任何东西,因为你试图将整个区域与只接受一个字符的正则表达式匹配。
我建议使用find(),在评论中按照Andreas的建议,或者使用像这样的正则表达式:
".*[öçğışü].*"
实际应该找到包含任何土耳其语特定字符的单词。
此外,我会指出正则表达式区分大小写,所以如果这些字母有大写变体,你也应该包含这些变量并修改你的替换语句。
最后(编辑):你可以使你的Pattern不区分大小写,但你的replaceAll仍然需要更改为不区分大小写。我不确定这对于非拉丁字符是如何工作的,所以你应该在依赖它之前测试那个标志。
Pattern p = Pattern.compile(".*[öçğışü].*", Pattern.CASE_INSENSITIVE);