检查字母是否是表情符号

bdv*_*bdv 5 java regex emoji

我想检查一封信是否是表情符号.我发现了一些类似的问题并发现了这个正则表达式:

private final String emo_regex = "([\\u20a0-\\u32ff\\ud83c\\udc00-\\ud83d\\udeff\\udbb9\\udce5-\\udbb9\\udcee])";
Run Code Online (Sandbox Code Playgroud)

但是,当我在以下句子中执行以下操作时:

for (int k=0; k<letters.length;k++) {    
    if (letters[k].matches(emo_regex)) {
        emoticon.add(letters[k]);
    }
}
Run Code Online (Sandbox Code Playgroud)

它不会添加任何表情符号的任何字母.我也试过用a Matcher和a Pattern,但那也没用.正则表达式有什么问题,或者我在代码中遗漏了哪些东西?

这就是我收到这封信的方式:

sentence = "Jij staat op 10 "
String[] letters = sentence.split("");
Run Code Online (Sandbox Code Playgroud)

应该识别并添加最后一个 emoticon

小智 7

我创建的这个函数检查给定的字符串是否只包含表情符号。换句话说,如果 String 包含任何未包含在 Regex 中的字符,它将返回 false。

private static boolean isEmoji(String message){
    return message.matches("(?:[\uD83C\uDF00-\uD83D\uDDFF]|[\uD83E\uDD00-\uD83E\uDDFF]|" +
            "[\uD83D\uDE00-\uD83D\uDE4F]|[\uD83D\uDE80-\uD83D\uDEFF]|" +
            "[\u2600-\u26FF]\uFE0F?|[\u2700-\u27BF]\uFE0F?|\u24C2\uFE0F?|" +
            "[\uD83C\uDDE6-\uD83C\uDDFF]{1,2}|" +
            "[\uD83C\uDD70\uD83C\uDD71\uD83C\uDD7E\uD83C\uDD7F\uD83C\uDD8E\uD83C\uDD91-\uD83C\uDD9A]\uFE0F?|" +
            "[\u0023\u002A\u0030-\u0039]\uFE0F?\u20E3|[\u2194-\u2199\u21A9-\u21AA]\uFE0F?|[\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55]\uFE0F?|" +
            "[\u2934\u2935]\uFE0F?|[\u3030\u303D]\uFE0F?|[\u3297\u3299]\uFE0F?|" +
            "[\uD83C\uDE01\uD83C\uDE02\uD83C\uDE1A\uD83C\uDE2F\uD83C\uDE32-\uD83C\uDE3A\uD83C\uDE50\uD83C\uDE51]\uFE0F?|" +
            "[\u203C\u2049]\uFE0F?|[\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE]\uFE0F?|" +
            "[\u00A9\u00AE]\uFE0F?|[\u2122\u2139]\uFE0F?|\uD83C\uDC04\uFE0F?|\uD83C\uDCCF\uFE0F?|" +
            "[\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA]\uFE0F?)+");
}
Run Code Online (Sandbox Code Playgroud)

实施示例:

public static int detectEmojis(String message){
    int len = message.length(), NumEmoji = 0;
    // if the the given String is only emojis.
    if(isEmoji(message)){
        for (int i = 0; i < len; i++) {
            // if the charAt(i) is an emoji by it self -> ++NumEmoji
            if (isEmoji(message.charAt(i)+"")) {
                NumEmoji++;
            } else {
                // maybe the emoji is of size 2 - so lets check.
                if (i < (len - 1)) { // some Emojis are two characters long in java, e.g. a rocket emoji is "\uD83D\uDE80";
                    if (Character.isSurrogatePair(message.charAt(i), message.charAt(i + 1))) {
                        i += 1; //also skip the second character of the emoji
                        NumEmoji++;
                    }
                }
            }
        }
        return NumEmoji;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

given 是一个在字符串(只有表情符号)上运行并返回其中表情符号数量的函数。(在我在 StackOverFlow 上找到的其他答案的帮助下)。

  • 我熟悉正则表达式,但它太复杂了,我不太明白你在那里做什么。 (2认同)

Cha*_*nya 6

你可以使用emoji4j库.以下内容应解决问题.

String htmlifiedText = EmojiUtils.htmlify(text);
// regex to identify html entitities in htmlified text
Matcher matcher = htmlEntityPattern.matcher(htmlifiedText);

while (matcher.find()) {
    String emojiCode = matcher.group();
    if (isEmoji(emojiCode)) {

        emojis.add(EmojiUtils.getEmoji(emojiCode).getEmoji());
    }
}
Run Code Online (Sandbox Code Playgroud)


tob*_*s_k 5

这些表情符号似乎有两个字符长,但由于split("")您在每个字符之间进行分割,因此这些字母都不是您正在寻找的表情符号。

相反,您可以尝试在单词之间进行拆分:

for (String word : sentence.split(" ")) {
    if (word.matches(emo_regex)) {
        System.out.println(word);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这当然会错过连接到单词或标点符号的表情符号。

或者,您可以在与正则表达式匹配的句子中使用 a Matcherto findany 。group

Matcher matcher = Pattern.compile(emo_regex).matcher(sentence);
while (matcher.find()) {
    System.out.println(matcher.group());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用Character类来确定字母是代理对的一部分。有一些有用的方法可以处理代理对表情符号,例如:

String text = "";
if (text.length() > 1 && Character.isSurrogatePair(text.charAt(0), text.charAt(1))) {
    int codePoint = Character.toCodePoint(text.charAt(0), text.charAt(1));
    char[] c = Character.toChars(codePoint);
}
Run Code Online (Sandbox Code Playgroud)

  • “☠”不是表情符号。它只是一个符号,但系统将其显示为表情符号。值为 9760。 (4认同)
  • **这不起作用,也不应该使用**,因为有些表情符号只包含一个字符,例如“☠”。length()是1。应该被否决,但目前不具有我的特权。 (2认同)

lih*_*uan 5

试试这个项目simple-emoji-4j

兼容表情符号 12.0 (2018.10.15)

简单:

EmojiUtils.containsEmoji(str)
Run Code Online (Sandbox Code Playgroud)