Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有效地替换字符串中所有不受支持的字符_Java_Android_String_Replace - Fatal编程技术网

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”