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

例如,我知道如何使用正则表达式将所有“å”、“ä”或“ö”替换为“”。问题是如何使用正则表达式替换一个字符,具体取决于它是哪个字符?肯定有比上述方法更好的使用正则表达式的方法吗?

4

4 回答 4

6

对于带有变音符号的拉丁字符,用于检索基本字母代码 + 变音符号组合代码的 unicode 规范化(java 文本)可能会有所帮助。就像是:

import java.text.Normalizer;
newString = Normalizer.normalize(string,
        Normalizer.Form.NFKD).replaceAll("\\p{M}", "");
于 2012-11-15T11:35:53.377 回答
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;
}
于 2012-11-15T11:35:02.270 回答
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());
于 2012-11-15T11:35:25.570 回答
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
于 2012-11-15T11:47:02.403 回答