5

SO (および Google) を検索しましたが、質問に対する完全に一致する回答が見つかりませんでした:

a 内のすべてのスウェーデン語の文字と空白を別の文字に置き換えたい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

これらの文字を一度に置き換える一般的な正規表現はないと思います。それとは別に、を使用することで交換作業を容易にすることができます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 に答える
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 に答える
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 に答える