如何从字符串中删除所有无法打印的字符+表情符号?

时间:2018-01-02 09:04:19

标签: java regex

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

我试过了,但它对表情符号不起作用:

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

示例:

“L'alphabetestgénial!”

  

最终结果:“L'alphabetestgénial!”

“Çac'estducœur❤️:)!”

  

预期的最终结果:“Çac'estducœur:)!”

1 个答案:

答案 0 :(得分:4)

\\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,}", " ");