2

在 PHP 中我会使用这个:

$text = "Je prends une thé chaud, s'il vous plaît";
$search = array('é','î','è'); // etc.
$replace = array('e','i','e'); // etc.
$text = str_replace($search, $replace, $text); 

但是 Java String 方法“replace”似乎不接受数组作为输入。有没有办法做到这一点(不必诉诸 for 循环来遍历数组)?

请说是否有比我尝试的方法更优雅的方法。

4

6 回答 6

3

一个非常好的方法是使用Apache Commons Lang 2.4 中replaceEach()的类中的方法。StringUtils

String text = "Je prends une thé chaud, s'il vous plaît";
String[] search = new String[] {"é", "î", "è"};
String[] replace = new String[] {"e", "i", "e"};
String newText = StringUtils.replaceEach(text, 
                search, 
                replace);

结果是

Je prends une the chaud, s'il vous plait
于 2009-06-19T09:13:25.473 回答
2

标准 API 中没有与 PHP 相同的方法,尽管 Apache Commons 中可能有一些方法。您可以通过单独替换字符来做到这一点:

s = s.replace('é','e').replace('î', 'i').replace('è', 'e');

一种更复杂的方法不需要您枚举要替换的字符(因此更有可能不会错过任何内容)但确实需要一个循环(无论如何都会在内部发生,无论您使用什么方法)将java.text.Normalizer用于分隔字母和变音符号,然后去掉所有字符类型为Character.MODIFIER_LETTER.

于 2009-06-19T09:13:13.570 回答
2

我不是 Java 人,但我建议使用Normalizer 类分解重音字符然后删除Unicode “组合”字符的通用解决方案。

于 2009-06-19T10:03:29.290 回答
1

你将不得不做一个循环:

String text = "Je prends une thé chaud, s'il vous plaît";
Map<Character, String> replace = new HashMap<Character, String>();
replace.put('é', "e");
replace.put('î', "i");
replace.put('è', "e");
StringBuilder s = new StringBuilder();
for (int i=0; i<text.length(); i++) {
  char c = text.charAt(i);
  String rep = replace.get(c);
  if (rep == null) {
    s.append(c);
  } else {
    s.append(rep);
  }
}
text = s.toString();

注意:某些字符被替换为多个字符。例如,在德语中,u-umlaut 转换为“ue”。

编辑:使它更有效率。

于 2009-06-19T08:55:03.233 回答
0

你需要一个循环。

一个有效的解决方案如下所示:

    Map<Character, Character> map = new HashMap<Character, Character>();
    map.put('é', 'e');
    map.put('î', 'i');
    map.put('è', 'e');

    StringBuilder b = new StringBuilder();
    for (char c : text.toCharArray())
    {
        if (map.containsKey(c))
        {
            b.append(map.get(c));
        }
        else
        {
            b.append(c);
        }
    }
    String result = b.toString();

当然,在实际程序中,您可以将地图的构建和替换封装在它们各自的方法中。

于 2009-06-19T09:10:59.783 回答
0

据我所知,没有标准方法,但这里有一个类可以满足您的要求:

http://www.javalobby.org/java/forums/t19704.html

于 2009-06-19T08:59:45.737 回答