繁体   English   中英

替换字符串中的特殊字符

[英]Replacing special characters from a string

只是想知道是否有更优雅和可维护的方法:

private String replaceSpecialChars(String fileName) {
    if (fileName.length() < 1) return null;

    if (fileName.contains("Ü")) {
        fileName = fileName.replace("Ü", "Ue");
    }

    if (fileName.contains("Ä")) {
        fileName = fileName.replace("Ä", "Ae");
    }

    if (fileName.contains("Ö")) {
        fileName = fileName.replace("Ö", "Oe");
    }

    if (fileName.contains("ü")) {
        fileName = fileName.replace("ü", "ue");
    }

    ...

    return fileName;
}

我仅限于 Java 6。

在进一步讨论之前,请注意您所做的实际上是不可能的。 例如,瑞典语中“Ö”的“ascii-fication”是“O”而不是“Oe”。 没有办法知道一个词是瑞典语还是德语; 毕竟,例如,瑞典人有时会搬到德国。 如果你打开一本德国电话簿,看到一个 Sjögren 夫人,然后你把它化为 Sjoegren,那你就搞砸了。

如果您想运行“大小写不敏感比较”,那么首先您必须回答几个问题。 穆勒等于穆勒等于穆勒吗? 那个兔子洞很深。

一般的解决方案是三元组或其他通用文本搜索工具,例如 postgres 提供的。 或者,选择退出此机制并将这些内容存储在 unicode 中,并且要清楚,要找到 Sjögren 女士,您将搜索“Sjögren”,原因与查找 Johnson 先生相同,您不是如果您尝试搜索Jahnson,就会去。

请注意,大多数文件系统允许使用 unicode 文件名; 无需尝试替换 Ü。

这也在某种程度上解释了为什么没有现成的库可用于这项看似常见的工作; 事实上,这项工作是不可能的。

如果必须Map<String, String>您可以通过使用带有替换的Map<String, String>来简化此代码。 由于上述原因,我建议不要这样做。 或者,只是......保持原样,但放弃包含。 这段代码不必要地缓慢而冗长。

之间没有区别:

if (fileName.contains("x")) fileName = fileName.replace("x", "y");

和只是fileName = fileName.replace("x", "y"); 除了前者更慢(如果你要求它替换一个它不包含的字符串,replace 不会创建一个新的字符串并返回自己。前者会搜索两次,后者只搜索一次,任何一个都不会new 字符串,除非需要进行实际的字符串替换。

然后你可以链接它:

if (fileName.isEmpty()) return null;
return fileName
    .replace("Ü", "Ue")
    .replace("Ä", "Ae")
    ...
    ;

但是,正如我所说,您可能不想这样做,除非您希望在将来某个时候有一个恼怒的人抱怨您把他们的姓氏化为乌有。

您可以删除不必要的if语句并使用String.replace方法 您的代码可能如下所示:

private static String replaceSpecialChars(String fileName) {
    if (fileName == null)
        return null;
    else
        return fileName
                .replace("Ü", "Ue")
                .replace("Ä", "Ae")
                .replace("Ö", "Oe")
                .replace("ü", "ue");
}
public static void main(String[] args) {
    System.out.println(replaceSpecialChars("ABc"));       // ABc
    System.out.println(replaceSpecialChars("ÜÄÖü"));      // UeAeOeue
    System.out.println(replaceSpecialChars("").length()); // 0
    System.out.println(replaceSpecialChars(null));        // null
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM