Java 替换字符串中的特殊字符

Java 替换字符串中的特殊字符,java,string,if-statement,replace,Java,String,If Statement,Replace,我只是想知道是否有一种更优雅、更易于维护的方法: private String replaceSpecialChars(字符串文件名){ if(fileName.length()

我只是想知道是否有一种更优雅、更易于维护的方法:

private String replaceSpecialChars(字符串文件名){
if(fileName.length()<1)返回null;
if(fileName.contains(“Ü”)){
fileName=fileName.replace(“Ü”、“Ue”);
}
if(fileName.contains(“Ä”)){
文件名=文件名。替换(“Ä”、“Ae”);
}
if(fileName.contains(“Ö”)){
fileName=fileName.replace(“Ö”、“Oe”);
}
if(fileName.contains(“ü”)){
fileName=fileName.replace(“u”,“ue”);
}
...
返回文件名;
}

我仅限于Java 6。

在进一步讨论这个问题之前,请注意,您所做的实际上是不可能的。例如,“Ö”在瑞典语中的“ascii”是“O”而不是“Oe”。没有办法知道一个词是瑞典语还是德语;毕竟,例如,瑞典人有时会搬到德国。如果你打开一本德语电话簿,看到一位舍格伦夫人,你把它告诉舍格伦,你就把它搞砸了

如果您想运行“案例和案例比较”,那么,首先您必须回答几个问题。穆勒等于穆勒等于穆勒吗?那个兔子洞很深

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

注意,大多数文件系统允许unicode文件名;没有必要试图更换一个Ü

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

如果必须,可以使用带有替换项的
映射来简化此代码。基于上述原因,我建议不要这样做。或者,只是。。保持原样,但要丢弃容器。这段代码毫无必要地缓慢而冗长

以下两者之间没有区别:

if (fileName.contains("x")) fileName = fileName.replace("x", "y");
只需
fileName=fileName.replace(“x”,“y”)
除了前者的速度较慢(如果您要求它替换不包含的字符串,则替换不会生成新字符串并返回自身。前者将搜索两次,后者仅搜索一次,并且除非需要进行实际的字符串替换,否则任何一个都不会生成新字符串

然后,您可以将其链接:

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

但是,正如我所说的,你可能不想这样做,除非你希望一个愤怒的人在将来的某个时候在电话里抱怨你把他们姓氏的ascification搞糟了。

在你进一步讨论这个问题之前,请注意你所做的实际上是不可能的。例如,瑞典语中“Ö”的“ascification”是“O”而不是“Oe”。没有办法知道一个词是瑞典语还是德语;毕竟,瑞典人有时会搬到德国。例如,如果你打开一本德语电话簿,看到一位舍格伦夫人,你把这个词告诉舍格伦,你就把事情搞砸了

如果你想进行“案例和案例比较”,那么,首先你必须回答几个问题。穆勒等于穆勒等于穆勒吗?兔子洞很深

一般的解决方案是使用trigrams或其他通用文本搜索工具,如postgres提供的工具。或者,选择退出此机制,并将这些内容存储在unicode中,并且要清楚,要找到Sjögren女士,您需要搜索“Sjögren”出于同样的原因,如果你试图寻找詹森,你就不会找到约翰逊先生

注意,大多数文件系统都允许unicode文件名;不需要尝试替换Ü

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

如果必须,您可以使用带有替换项的
映射来简化此代码。出于上述原因,我建议您不要使用此映射。或者,保持原样,但不要使用包含项。此代码不必要地缓慢且冗长

以下两者之间没有区别:

if (fileName.contains("x")) fileName = fileName.replace("x", "y");
只需
fileName=fileName.replace(“x”,“y”);
,但前者的速度要慢得多(replace不会生成新字符串,如果您要求它替换不包含的字符串,它会返回自身。前者将搜索两次,后者仅搜索一次,除非需要实际替换字符串,否则任何一个都不会生成新字符串

然后,您可以将其链接:

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

但是,正如我所说的,你可能不想这样做,除非你想让一个愤怒的人在将来的某个时候抱怨你搞错了他们姓氏的ascification。

如果
语句使用了一系列方法,你可以删除不必要的
。你的代码可能如下所示:

private静态字符串替换specialchars(字符串文件名){
如果(文件名==null)
返回null;
其他的
返回文件名
.替换(“Ü”、“Ue”)
.替换(“Ä”、“Ae”)
.替换(“Ö”、“Oe”)
.替换(“u”、“ue”);
}
publicstaticvoidmain(字符串[]args){
System.out.println(replaceSpecialChars(“ABc”);//ABc
System.out.println(replaceSpecialChars(“ÜÄÖ”);//UEAEUE
System.out.println(replacespeciallchars(“”.length());//0
System.out.println(replaceSpecialChars(null));//null
}

如果
语句使用了一系列方法,则可以删除不必要的
。您的代码可能如下所示:

private静态字符串替换specialchars(字符串文件名){
如果(文件名==null)
返回null;
其他的
返回文件名
.替换(“Ü”、“Ue”)
.替换(“Ä”、“Ae”)
.替换(“Ö”、“Oe”)