Java 有效地替换字符串中所有不受支持的字符
可能重复:Java 有效地替换字符串中所有不受支持的字符,java,android,string,replace,Java,Android,String,Replace,可能重复: 我需要替换所有重音字符,例如 "à", "é", "ì", "ò", "ù" 与 因为保存后重新加载带有重音字符的嵌套字符串时出现问题 有没有一种方法可以做到这一点,而不用为所有字符使用不同的字符串替换 例如,我宁愿避免这样做 text = text.replace("a", "a'"); text2 = text.replace("è", "e'"); text3 = text2.replace("ì", "i'"); text4 = text3.replace("ò", "
我需要替换所有重音字符,例如
"à", "é", "ì", "ò", "ù"
与
因为保存后重新加载带有重音字符的嵌套字符串时出现问题
有没有一种方法可以做到这一点,而不用为所有字符使用不同的字符串替换
例如,我宁愿避免这样做
text = text.replace("a", "a'");
text2 = text.replace("è", "e'");
text3 = text2.replace("ì", "i'");
text4 = text3.replace("ò", "o'");
text5 = text4.replace("ù", "u'");
等等。由于字符的ASCII值与其重音版本之间没有严格的相关性,在我看来,您的替换似乎是最简单的方法 由于字符的ASCII值与其重音版本之间没有严格的相关性,在我看来,您的替换似乎是最直接的方法 如果您不介意添加commons lang作为依赖项,请尝试 我相信以下人员也能完成同样的任务:
import org.apache.commons.lang.StringUtils;
public class ReplaceEachTest
{
public static void main(String [] args)
{
String text = "àéìòùàéìòù";
String [] searchList = {"à", "é", "ì", "ò", "ù"};
String [] replaceList = {"a'", "e'", "i'", "o'", "u'"};
String newtext = StringUtils.replaceEach(text, searchList, replaceList);
System.out.println(newtext);
}
}
此示例打印a'e'i'o'u'a'e'i'o'u'
但是,总的来说,我同意,因为您正在创建自定义字符翻译,所以您需要一个解决方案,在该解决方案中,您可以明确指定每个感兴趣的字符的替换
我以前使用replaceChars的回答是不好的,因为它只处理一对一的字符替换。如果您不介意添加commons lang作为依赖项,请尝试 我相信以下人员也能完成同样的任务:
import org.apache.commons.lang.StringUtils;
public class ReplaceEachTest
{
public static void main(String [] args)
{
String text = "àéìòùàéìòù";
String [] searchList = {"à", "é", "ì", "ò", "ù"};
String [] replaceList = {"a'", "e'", "i'", "o'", "u'"};
String newtext = StringUtils.replaceEach(text, searchList, replaceList);
System.out.println(newtext);
}
}
此示例打印a'e'i'o'u'a'e'i'o'u'
但是,总的来说,我同意,因为您正在创建自定义字符翻译,所以您需要一个解决方案,在该解决方案中,您可以明确指定每个感兴趣的字符的替换
我以前使用replaceChars的回答是不好的,因为它只处理一对一的字符替换。我从这个角度尝试了这个方法,它似乎有效
String str= Normalizer.normalize(str, Normalizer.Form.NFD);
str= str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "'");
编辑:
但是替换组合变音符号有一个副作用,你无法区分ÀÁ我从这个角度尝试了这个方法,它似乎有效
String str= Normalizer.normalize(str, Normalizer.Form.NFD);
str= str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "'");
编辑:
但是,替换组合变音符号会产生一个副作用,即您无法区分ÀÁ在阅读主要方法中的注释后,我认为更好的选择是解决问题-这与编码有关不要试图掩盖症状 此外,这仍然需要手动显式映射,这可能会比nandeesh使用正则表达式unicode字符类的答案更不理想
下面是执行映射的代码的框架。它比一个字符稍微复杂一些 这段代码试图避免额外的字符串。它可能“更有效率”,也可能没有。用真实的数据/用法尝试一下。YMMV
String mapAccentChar (char ch) {
switch (ch) {
case 'à': return "a'";
// etc
}
return null;
}
String mapAccents (String input) {
StringBuilder sb = new StringBuilder();
int l = input.length();
for (int i = 0; i < l; i++) {
char ch = input.charAt(i);
String mapped = mapAccentChar(ch);
if (mapped != null) {
sb.append(mapped);
} else {
sb.append(ch);
}
return sb.toString();
}
String-mappentchar(char-ch){
开关(ch){
案例“a”:返回“a”;
//等
}
返回null;
}
字符串映射重音符号(字符串输入){
StringBuilder sb=新的StringBuilder();
int l=input.length();
对于(int i=0;i
在阅读了主要方法中的注释后,我认为更好的选择是解决问题-这与编码有关?-而不是试图掩盖症状
此外,这仍然需要手动显式映射,这可能会比nandeesh使用正则表达式unicode字符类的答案更不理想
下面是执行映射的代码框架。它比char稍微复杂一些 这段代码试图避免额外的字符串。它可能更有效,也可能不更有效。请使用实际数据/usage.YMMV进行尝试
String mapAccentChar (char ch) {
switch (ch) {
case 'à': return "a'";
// etc
}
return null;
}
String mapAccents (String input) {
StringBuilder sb = new StringBuilder();
int l = input.length();
for (int i = 0; i < l; i++) {
char ch = input.charAt(i);
String mapped = mapAccentChar(ch);
if (mapped != null) {
sb.append(mapped);
} else {
sb.append(ch);
}
return sb.toString();
}
String-mappentchar(char-ch){
开关(ch){
案例“a”:返回“a”;
//等
}
返回null;
}
字符串映射重音符号(字符串输入){
StringBuilder sb=新的StringBuilder();
int l=input.length();
对于(int i=0;i
如果解决了“重新加载带重音字符的嵌套字符串的问题”超出了您的能力或时间限制,可能更容易避免此字符集/编码问题的方法是存储base64编码的字符串。您可以使用api Normalize.Normalize来执行此操作。检查此项@nandeesh:我认为OP试图保留重音字符。@BheshGurung Normalize据我所知,api确实能转换成英文字母,但我从未尝试过though@rambocoder基本上,我需要使用这种变通方法,因为如果要解决“重新加载带重音字符的嵌套字符串的问题”,我还没有找到有效的解决方案超出了您的能力或时间限制,可能更容易避免此字符集/编码问题的方法是存储base64编码的字符串。您可以使用api Normalize.Normalize来执行此操作。检查此项@nandeesh:我认为OP试图保留重音字符。@BheshGurung Normalize据我所知,api确实能转换成英文字母,但我从未尝试过though@rambocoder基本上,我需要使用这种变通方法,因为我还没有找到一个有效的解决方案,但是用a'替换重音字符a,或者干脆把重音字符a变成a??第一个答案用a替换了a,我误解了问题,b但是我编辑了它,我更改了replaceall行。请检查它+1我喜欢这种方法。正则表达式引擎在这类操作中通常也相当有效(没有回溯喧嚣)但是,如果我将其用于中文输入,会发生什么情况?我认为它不会进行任何转换。Normalize只会更改重音字母表,但会将重音字符替换为“a”,或者干脆将重音字符替换为“a”