所有不支持字符的字符串Efficently更换[复制](Efficently Replacement

2019-09-29 05:11发布

可能重复:
符号转换,雅绅特来函英文字母

我需要替换所有重音字符,如

"à", "é", "ì", "ò", "ù"

"a'", "e'", "i'", "o'", "u'"...

因为他们已经保存重装后用重音字符的字符串嵌套一个问题。

有没有办法做到这一点,而无需使用不同的字符串替换所有字符?

举例来说,我宁愿避免做

text  = text.replace("a", "a'");
text2 = text.replace("è", "e'");
text3 = text2.replace("ì", "i'");
text4 = text3.replace("ò", "o'");
text5 = text4.replace("ù", "u'");

等等

Answer 1:

我想这个从这个职位似乎工作。

String str= Normalizer.normalize(str, Normalizer.Form.NFD);
str= str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "'");

编辑:但用组合变音标记,有副作用,就是不能A A A区分



Answer 2:

如果你不介意加入公地郎作为依赖,尝试StringUtils.replaceEach我相信下面的执行同样的任务:

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答案是否定的好,因为它只能处理一到一个字符替换。



Answer 3:

在主要做法阅读评论后,我想一个更好的选择将解决这个问题 - 这是编码相关? - 而不是试图掩盖症状。

此外,这还需要手动显式的映射,这可能使它比nandeesh的使用正则表达式的Unicode字符类的回答不太理想的。


下面是代码来执行所述映射的骨架。 它是略高于一炭炭更加复杂。

此代码试图避免额外的字符串。 它可能是或不是“更有效率”。 与真实数据/使用试试吧。 因人而异。

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


Answer 4:

既然有一个字符的ASCII值及其重音的版本之间没有严格的相关性,您的更换在我看来,最直接的方法。



文章来源: Efficently Replacement of all unsupported chars in a String [duplicate]