正则表达式将所有土耳其符号替换为常规拉丁符号

时间:2016-08-30 16:05:59

标签: java regex

我有一个类将所有土耳其符号替换为类似的拉丁符号,并将结果传递给搜索者。

这些是符号替换的方法

@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();
    }

但是这总是会返回未经修改的单词声明。

我做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:6)

根据Java 7 api,Matcher.matches()

  

尝试将整个区域与模式匹配。

你的模式是“[öçğışü]”,regex101.com(一个很棒的资源)说匹配

  

列表中的单个字符öçğışü字面

也许您可能已经看到了问题。除了一个土耳其字符之外,你的正则表达式不会匹配任何东西,因为你试图将整个区域与只接受一个字符的正则表达式匹配。

我建议使用find(),在评论中按照Andreas的建议,或者使用像这样的正则表达式:

".*[öçğışü].*"

实际应该找到包含任何土耳其语特定字符的单词。

此外,我会指出正则表达式区分大小写,所以如果这些字母有大写变体,你也应该包含这些变量并修改你的替换语句。

最后(编辑):你可以使你的Pattern不区分大小写,但你的replaceAll仍然需要更改为不区分大小写。我不确定这对于非拉丁字符是如何工作的,所以你应该在依赖它之前测试那个标志。

Pattern p = Pattern.compile(".*[öçğışü].*", Pattern.CASE_INSENSITIVE);