【问题标题】:Replace strings like \a25 in a string替换字符串中的 \a25 之类的字符串
【发布时间】:2016-10-03 16:53:47
【问题描述】:

我的文本中有一些特殊字符,例如:

Nur bei guter \U25berwachung k\o25rperliche Belastung pr\u25fen und Sie entsprechend

我有一张将这些映射到德国变音符号的表格;编码为十六进制 unicode 字母。我正在尝试在文本中替换它们,但我失败了......

对于 \U25,所需的输出是 Ü,对于 \025 是 ö,对于 \u25 是 ü。

我尝试了很多东西,例如

Pattern p = Pattern.compile("(\\\\[0-9A-Za-z]{3})", Pattern.MULTILINE);
Matcher matcher = p.matcher(v);
String replacement = "00FB";
while (matcher.find()) {
    String match = matcher.group();
    int hexToInt = Integer.parseInt(replacement, 16);
    v = matcher.replaceFirst("" + hexToInt);
}

使用最后一行v = matcher.replaceFirst(match, "Ü"); 会使我的程序永远挂起。我也试过str.replace()的方法,无济于事……

部分人物:

【问题讨论】:

  • 您的replaceFirst 调用不会按原样编译...
  • 对不起,谢谢@Mena,那是来自 str.replace....
  • 没有问题。您只需要替换这 3 个实体吗?
  • 不,有几千个。这是大量的数据...@Mena
  • 嗯。我一般不擅长编码,但我不确定这里的转换规则是什么。基本上是[vowel] + [25 for uhmlaut]?还有其他类型的变音符号等。你需要转换吗?

标签: java regex unicode hex


【解决方案1】:

据我所知,这种编码不是标准的。不过,您可以像这样“整齐”地实现它:

private static Map<String, String> CONVERSIONS = new HashMap<String, String>() {{
    put("\\U25", "Ü");
    put("\\o25", "ö");
    put("\\u25", "ü");
}};

private static String convert(String str) {
    for (Map.Entry<String, String> conversion : CONVERSIONS.entrySet()) {
        str = str.replace(conversion.getKey(), conversion.getValue());
    }
    return str;
}

请注意,您不应使用基于正则表达式的 replaceAll() - 只需使用纯文本匹配 replace() 方法(它仍会替换所有匹配项)。

然后简单的使用:

String str = convert("Nur bei guter \\U25berwachung k\\o25rperliche Belastung pr\\u25fen und Sie entsprechend");
System.out.println(str);

输出:

Nur bei guter Überwachung körperliche Belastung prüfen und Sie entsprechend

我已经使用了地图的内联初始化,但是您可以通过读取属性或 csv 或类似文件来轻松调整地图的初始化,这将使整个事情变得非常容易管理。

【讨论】:

  • 谢谢。这与我现在所做的非常接近。我从 pdf 中提取映射并将它们保存到 redis。现在它开始工作了.. :)
猜你喜欢
  • 2013-01-04
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2013-11-05
  • 2011-10-20
相关资源
最近更新 更多