【问题标题】:Unable to strip invalid unicode characters java无法去除无效的unicode字符java
【发布时间】:2015-12-16 21:38:09
【问题描述】:

我的数据需要在其他各种应用程序中进一步处理之前进行清理。在这个过程中,下游应用程序之一只允许一定范围的 Unicode 字符。以下是我用来去除无效 Unicode 字符的正则表达式。

/[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]/

但是,我仍然无法让正则表达式在 Java 中工作。是否有处理上述正则表达式的特殊方法,因为它包含一系列 Unicode 字符?

更新: 这就是我测试的方式,但似乎并没有按照@Andreas 建议的方式工作:

public void testStripUnicode() {
        String doc = "{\"fields\":{\"field1\":\"unicode char '\\u000b'\",\"field2\":[\"unicode char '\\u0003'\"]}}";
        String stripped = DocumentCleaner.clean(doc);
        System.out.println(doc);
        System.out.println(stripped);
    }

文档
{"fields":{"field1":"unicode char '\u000b'","field2":["unicode char '\u0003'"]}} 剥离文档
{"fields":{"field1":"unicode char '\u000b'","field2":["unicode char '\u0003'"]}}

【问题讨论】:

    标签: java regex unicode


    【解决方案1】:

    应该没问题,只需去掉斜线 / 并将反斜线加倍 \

    String regex = "[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]";
    String stripped = value.replaceAll(regex, "");
    

    或者如果你反复这样做,你可以先解析一次正则表达式:

    // Prepare regular expression
    Pattern p = Pattern.compile("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]");
    
    // Use regular expression
    String stripped = p.matcher(value).replaceAll("");
    

    【讨论】:

    • @AdiGuN 测试字符串不包含您的正则表达式将剥离的任何字符 - 字符串文字 "\\u0003" 是六个字符的反斜杠、u、0003,而不是单个字符 U+0003 .如果您想删除这些转义序列以及它们所代表的字符,那么您将需要一个不同的正则表达式。
    • @IanRoberts 你能详细说明一下吗?正则表达式前面似乎包含一个 ^,所以应该去掉 \u0003 吧?
    • @AdiGuN 不,您的字符串包含 6 个字符 '\', 'u', '0', '0', '0', '3'不是单个 Unicode 字符 U+0003 (END OF TEXT)
    • 我明白了。我可以用另一种方式测试它吗?在我将它应用到我的庞大数据集之前
    • @AdiGuN 在庞大数据集的较小子集上尝试。
    猜你喜欢
    • 2018-05-08
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多