移除✅🔥✈♛;以及来自Java字符串的其他类似表情/图像/符号

移除✅🔥✈♛;以及来自Java字符串的其他类似表情/图像/符号,java,string,emoji,Java,String,Emoji,我有一些字符串,里面有各种不同的表情/图像/符号 并非所有字符串都是英语的,其中一些字符串是其他非拉丁语言的,例如: ▓ 铁路?? → 猫和狗 基于您有1644个不同的Unicode代码点要删除,我选择了。例如✅在此列表中为 有了完整的表情符号列表,你需要使用。在单个字符或字节上迭代将不起作用,因为单个代码点可以跨越多个字节。因为Java使用UTF-16,所以emojis通常需要两个chars String input = "ab✅cd"; for (int i = 0; i < inpu

我有一些字符串,里面有各种不同的表情/图像/符号

并非所有字符串都是英语的,其中一些字符串是其他非拉丁语言的,例如:

▓ 铁路??
→ 猫和狗
基于您有1644个不同的Unicode代码点要删除,我选择了。例如
在此列表中为

有了完整的表情符号列表,你需要使用。在单个
字符
字节
上迭代将不起作用,因为单个代码点可以跨越多个字节。因为Java使用UTF-16,所以emojis通常需要两个
char
s

String input = "ab✅cd";
for (int i = 0; i < input.length();) {
  int cp = input.codePointAt(i);
  // filter out if matches
  i += Character.charCount(cp); 
}
或者因为Java支持Unicode字符串:

int viSign = "✅".codePointAt(0);

与其将某些元素列入黑名单,不如创建一个您希望保留的字符的白名单?这样你就不必担心每一个新的表情符号被添加

String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");
因此:

  • [\\p{L}\\p{M}\\p{N}\\p{p}\\p{Z}\\p{Cf}\\p{Cs}\\s]
    是一个范围,表示所有数字(
    \\p{N}
    )、字母(
    \\p{L}
    )、标记(
    \\p{M}
    )、标点(
    \\p}
    \\p}
\\p})、空格/格式(
\\p})、其他(
\\p{Cs}
)中
U+FFFF
上方的其他字符,以及换行符(
\\s
\\p{L}
特别地
包括来自其他字母的字符,如西里尔字母、拉丁字母、汉字等
  • 正则表达式字符集中的
    ^
    将使匹配项无效
  • 例如:

    String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。I'm not super into Java, so I won't try to write example code inline, but the way I would do this is to check what Unicode calls "the general category" of each character. There are a couple letter and punctuation categories.

    You can use Character.getType to find the general category of a given character. You should probably retain those characters that fall in these general categories:

    COMBINING_SPACING_MARK
    CONNECTOR_PUNCTUATION
    CURRENCY_SYMBOL
    DASH_PUNCTUATION
    DECIMAL_DIGIT_NUMBER
    ENCLOSING_MARK
    END_PUNCTUATION
    FINAL_QUOTE_PUNCTUATION
    FORMAT
    INITIAL_QUOTE_PUNCTUATION
    LETTER_NUMBER
    LINE_SEPARATOR
    LOWERCASE_LETTER
    MATH_SYMBOL
    MODIFIER_LETTER
    MODIFIER_SYMBOL
    NON_SPACING_MARK
    OTHER_LETTER
    OTHER_NUMBER
    OTHER_PUNCTUATION
    PARAGRAPH_SEPARATOR
    SPACE_SEPARATOR
    START_PUNCTUATION
    TITLECASE_LETTER
    UPPERCASE_LETTER
    

    String str=“你好,世界”皆さん、こんにちは! 私はジョンと申します。 我不太喜欢Java,所以我不会尝试内联编写示例代码,但我要做的是检查Unicode对每个字符的“一般类别”是什么

    您可以使用查找给定字符的常规类别。您可能应该保留属于这些常规类别的字符:

    package zmarcos.emoji;
    
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Set;
    
    public class TestEmoji {
    
        public static void main(String[] args) {
            String[] arr = {"Remove ✅, ICU4J is your friend.

    UCharacter.hasBinaryProperty(UProperty.EMOJI);
    

    (您列出的所有特别想要删除的字符都有通用类别
    其他\u符号,我没有将其包括在上面的类别白名单中。)

    我在下面举了一些例子,认为拉丁语就足够了,但是

    有没有办法从输入字符串中删除所有这些符号 只保留不同语言中的字母和标点符号

    编辑之后,使用
    Character.getType
    方法开发了一个新的解决方案,这似乎是最好的解决方案

    $('#text').remove('emoji').fast()
    
    包zmarcos.emoji;
    导入java.util.array;
    导入java.util.HashSet;
    导入java.util.Set;
    公共类测试工具{
    公共静态void main(字符串[]args){
    字符串[]arr={“删除”✅,  ICU4J是你的朋友

    EmojiUtils.removeEmoji(str)
    
    请记住保持您的icu4j版本为最新版本,并注意这只会过滤掉官方Unicode表情符号,而不是符号字符。请根据需要结合过滤掉其他字符类型

    更多信息:

    使用名为RM Emoji的jQuery插件。它的工作原理如下:

    这是一种快速模式,可能会错过一些表情符号,因为它使用启发式算法在文本中查找表情符号。使用
    .full()
    方法扫描整个字符串并删除所有表情符号。

    尝试此项目

    与表情符号12.0兼容(2018.10.15)

    简单地说:


    你想保留什么?两个问题:什么是EmojiParser?似乎不是标准库的一部分,所以这一点没有多大帮助。你到底想过滤哪些字符?你说“更多的此类字符”,但是有很多角色组和家庭。我们需要更多地了解你的标准。IDK你的动机是什么,但如果它太过过滤文本输入:不要。我厌倦了被迫使用a-zA-Z。让我用我的母语,或表情符号,或我想要的任何东西来写。我真的想要我的日历约会吗"请澄清您到底想保留和删除什么。表面上看,这个问题似乎很清楚,但由于Unicode的复杂性,因此不可能提供一个好的答案。当它破坏了至少一个示例的含义时,这似乎是一件奇怪的事?非常有用的列表。Interesting使用removeAllEmojis方法调用EmojiParser无法处理这些…:-)@Bergi:No,因为
    input.codePointAt
    最多只能查看2个字符,这是一个常量上限。另外(新添加的)
    i+=Character.charCount(cp)
    跳过所有
    input.codepoint
    检查过的字符(在某些情况下为-1)。@OlivierGrégoire:
    String.chars()
    在字符而非代码点上进行流式处理。这有一种单独的方法。这里至少有两个问题:您使用的是一个“封闭”表情列表,因此每年都必须对其进行扩展(但这可能不容易解决),并且这段代码可能无法正确处理代码点序列(参见示例)这与EmojiParser使用的方法基本相同,并且由于相同的原因很快就会失败。新的emojis会相对频繁地添加到Unicode字符数据库中,如果您现在正在为负规则集实施一个使用当前定义的1644 emojis的解决方案,那么一旦新的emojis可用,实现就会失败标签。ASCII字母数字字符和表情符号之间的明显差距是重音和非拉丁字母。没有OP的输入,我们不知道这是否是一个好答案(但不是我的DV)是的,我很好奇为什么这可能会被否决。当我看到这个问题时,我首先想到的绝对是正则表达式(P.S.因为他在寻找标准字符和标点符号,我会使用类似于
    [^\w\^-\[\]\!@$%&*
    
    EmojiUtils.removeEmoji(str)