java - 如何从字符串中删除所有不可打印的字符+表情符号?

标签 java regex

我想从我的字符串中删除所有不可打印的字符和所有表情符号。

我尝试过,但它不适用于表情符号:

public static String removeAllNoAsciiChars(String str) {
        if (!TextUtils.isEmpty(str)) {
            str = str.replaceAll("\\p{C}", "");
        }
        return str;
    }

示例:

“L'alphabet est génial 😀!”

Final result expected: "L'alphabet est génial !"

“这就是心❤️:)!”

Final result expected: "Ça c'est du cœur :) !"

最佳答案

\\p{C} 正则表达式处理所有不可打印的字符。请注意,这包括制表符和换行符。

至于表情符号字符,那就有点复杂了。您可以只匹配 Unicode 中较新的表情符号字符,即 Unicode Block 'Emoticons' (U+1F600 到 U+1F64F),但这并不是所有表情符号字符,例如❤ 'HEAVY BLACK HEART' (U+2764) 不在该范围内。

如果你看看那些表情符号字符,例如😀 'GRINNING FACE' (U+1F600),你会看到它属于 Unicode 类别“Symbol, Other [So]”,由 5855 个字符组成。如果您可以删除所有这些,那绝对是最简单的解决方案。

您的文本包含红心 (❤️),而不是黑心 (❤),这是通过在黑心后添加变体选择器在 Unicode 中完成的,例如一个'VARIATION SELECTOR-16'在本例中为 (U+FE0F)。有 256 个变体选择器,它们都在类别 Mark, Nonspacing [Mn] 中,但您可能不想删除其中所有 1763 个,因此您需要删除 2 个变化选择器范围,即 U+FE00 到 U+FE0F(选择器 1-16)和 U+E0100 到 U+E01EF(选择器 17-256)。

之后,您可能希望也可能不想将连续空格减少为单个空格。

str = str.replaceAll("[\\p{C}\\p{So}\uFE00-\uFE0F\\x{E0100}-\\x{E01EF}]+", "")
         .replaceAll(" {2,}", " ");

关于java - 如何从字符串中删除所有不可打印的字符+表情符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48058158/

相关文章:

Python正则表达式提取关键字前的最新数字

regex - 用 grep/sed 替换许多任意 Markdown 链接

java - 在启动时集成 tomcat 和 Quartz 调度程序

java - 动态 GString 创建不符合我的预期

java - java获取字符串中元素个数的方法

java - ExecutorService 没有关闭

java - Ctrl+Shift+G 在 Eclipse 中不再有效

regex - .htaccess 中的 CodeIgniter 查询字符串重写

regex - 数字后跟句点的正则表达式是什么?

正则表达式返回空白输出 Hive