我想从我的字符串中删除所有不可打印的字符和所有表情符号。
我尝试过,但它不适用于表情符号:
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/