java - 从字符串中删除特定 unicode 范围的字符

标签 java regex utf-8

我有一个程序可以从 Twitter 流 API 实时解析推文。在存储它们之前,我将它们编码为 utf8。某些字符最终在字符串中显示为 ?、?? 或 ???而不是它们各自的 unicode 代码并导致问题。经过进一步调查,我发现有问题的字符来自 "emoticon" block , U+1F600 - U+1F64F, and the "Miscellaneous Symbols And Pictographs" block, U+1F300 - U+1F5FF. 我尝试删除,但没有成功,因为匹配器最终替换了字符串中的几乎每个字符,而不仅仅是我想要的 unicode范围。

String utf8tweet = "";
        try {
            byte[] utf8Bytes = status.getText().getBytes("UTF-8");

            utf8tweet = new String(utf8Bytes, "UTF-8");

        } 
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
Pattern unicodeOutliers = Pattern.compile("[\\u1f300-\\u1f64f]", Pattern.UNICODE_CASE | Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE);
Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(utf8tweet);
utf8tweet = unicodeOutlierMatcher.replaceAll(" ");

我该怎么做才能删除这些字符?

最佳答案

在正则表达式模式中添加否定运算符 ^。要过滤可打印字符,您可以使用以下表达式 [^\\x00-\\x7F],您应该会得到想要的结果。

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UTF8 {
    public static void main(String[] args) {
        String utf8tweet = "";
        try {
            byte[] utf8Bytes = "#Hello twitter  How are you?".getBytes("UTF-8");

            utf8tweet = new String(utf8Bytes, "UTF-8");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Pattern unicodeOutliers = Pattern.compile("[^\\x00-\\x7F]",
                Pattern.UNICODE_CASE | Pattern.CANON_EQ
                        | Pattern.CASE_INSENSITIVE);
        Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(utf8tweet);

        System.out.println("Before: " + utf8tweet);
        utf8tweet = unicodeOutlierMatcher.replaceAll(" ");
        System.out.println("After: " + utf8tweet);
    }
}

结果如下:

Before: #Hello twitter  How are you?
After: #Hello twitter   How are you?

编辑

为了进一步说明,您还可以继续使用 \u 形式表示范围,如下所示 [^\\u0000-\\u007F],这将匹配所有不是前 128 个 UNICODE 字符的字符(与之前相同)。如果要扩展范围以支持额外的字符,可以使用 UNICODE 字符列表 here 来实现.

例如,如果你想包含带重音的元音(用于西类牙语),你应该将范围扩展到 \u00FF,所以你有 [^\\u0000-\\u00FF] [^\\x00-\\xFF]:

Before: #Hello twitter  How are you? á é í ó ú
After: #Hello twitter   How are you? á é í ó ú

关于java - 从字符串中删除特定 unicode 范围的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12013341/

相关文章:

java - 如何用java编写自己的插件加载器?

python正则表达式来检测一个词是否存在

Python 正则表达式 : Capture lookahead value (capturing text without consuming it)

python - 如何在 Python 中将 UTF8 字符串从应用程序保存到网络服务器

java - 为什么 Java 没有异步/等待?

java - bash 脚本问题启动程序

java - 如何从放置在另一个类/包中的按钮切换选项卡?

regex - 如何使用 Regex 在 Bash 中查找递归子字符串?

postgresql - 通过 ADF 从 PostgreSQL 检索数据时,希腊字符集导致问题

debugging - 使用 qInstallMsgHandler 输出 UTF-8