根据不同的字符替换字符

5

我在SO(和Google)上搜索了很久,但没有找到完全符合我问题的答案:

我想要用另一个字符替换一个 String 中的所有瑞典字符和空格。我希望它按以下方式工作:

  • "å" 和 "ä" 应该被替换为 "a"
  • "ö" 应该被替换为 "o"
  • "Å" 和 "Ä" 应该被替换为 "A"
  • "Ö" 应该被替换为 "O"
  • " " 应该被替换为 "-"

这可以通过正则表达式(或其他方式)实现吗?如果可以,怎么做呢?

当然,下面的方法可以完成任务(并且可以改进,例如在同一行上替换 "å" 和 "ä"):

private String changeSwedishCharactersAndWhitespace(String string) {
    String newString = string.replaceAll("å", "a");
    newString = string.replaceAll("ä", "a");
    newString = string.replaceAll("ö", "o");
    newString = string.replaceAll("Å", "A");
    newString = string.replaceAll("Ä", "A");
    newString = string.replaceAll("Ö", "O");
    newString = string.replaceAll(" ", "-");
    return newString;
}

我知道如何使用正则表达式替换所有的 "å","ä" 或 "ö" 为 ""。问题是,我该如何根据字符类型使用正则表达式将一个字符替换为另一个字符?一定有更好的方法使用正则表达式而不是上述方法吧?

3
去掉所有重音符号是否对你有用?... - Zutty
也许可以使用带回调函数的正则表达式,但这不是普通的搜索和替换。由于Java没有一级函数,这会变得难以处理。坚持你现有的方法。 - John Dvorak
@Zutty 谢谢,但我的真正问题是我不想把它们删除,而是根据字符替换它们。否则我会做类似于你的建议的事情。 - Magnilex
@Zutty 我改变了主意,那个链接的问题/答案实际上包含了我要找的答案。由于英语不是我的母语,我并不真正知道“变音符号”这个词,以为整个字符都会被删除。 - Magnilex
4个回答

6

对于带有变音符号的拉丁字符,可以使用Unicode标准化(Java文本)来检索基本字母代码+变音符号组合代码。例如:

import java.text.Normalizer;
newString = Normalizer.normalize(string,
        Normalizer.Form.NFKD).replaceAll("\\p{M}", "");

3
你可以使用StringUtils.replaceEach,用法如下:
private String changeSwedishCharactersAndWhitespace(String string) {
    String newString = StringUtils.replaceEach (string, 
      new String[] {"å", "ä", "ö", "Å", "Ä", "Ö", " "}, 
      new String[] {"a", "a", "o", "A", "A", "O", "-"});
    return newString;
}

3

我认为没有一种通用的正则表达式可以一次性替换这些字符。除此之外,您可以通过使用 HashMap 来简化替换工作。

HashMap<String, String> map = new HashMap<String, String>()
                              {{put("ä", "a"); /*put others*/}};

for (Map.Entry<String, String> entry : map.entrySet())
    newString = string.replaceAll(entry.getKey(), entry.getValue());

你可以使用 new HashMap<String, String> {{put("ä", "a");...}}(),来节省一些字节。 - John Dvorak
@JanDvorak 感谢您的好建议。无论如何,您的片段存在语法错误,但我已经在我的代码中包含了正确的版本。 - Juvanis

0
你可以使用matcher.find方法编写自己的映射器:
public static void main(String[] args) {
    String from = "äöÂ";
    String to   = "aoA";
    String testString = "Hellö Wärld";

    Pattern p = Pattern.compile(String.format("[%s]", from));
    Matcher m = p.matcher(testString);
    String result = testString;
    while (m.find()){
        char charFound = m.group(0).charAt(0);
        result = result.replace(charFound, to.charAt(from.indexOf(charFound)));
    }

    System.out.println(result);
}

这将被替换

Hellö Wärld

使用

Hello Warld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接