检查字母是否是表情符号

时间:2015-02-06 12:48:42

标签: java regex emoji

我想检查一封信是否是表情符号。我已经找到了一些类似的问题并找到了这个正则表达式:

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

然而,当我在以下句子中执行以下操作时:

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

它不会添加任何表情符号的任何字母。我还尝试使用MatcherPattern,但这也无效。正则表达式有什么问题,或者我在代码中遗漏了哪些东西?

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

sentence = "Jij staat op 10 "
String[] letters = sentence.split("");

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

7 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:3)

似乎那些表情符号长了两个字符,但是split("")你在每个单个字符之间分裂,因此这些字母都不能成为你正在寻找的表情符号。

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

for (String word : sentence.split(" ")) {
    if (word.matches(emo_regex)) {
        System.out.println(word);
    }
}

但当然这会错过与单词或标点符号相关的表情符号。

或者,您可以在与正则表达式匹配的句子中使用Matcherfind任意group

Matcher matcher = Pattern.compile(emo_regex).matcher(sentence);
while (matcher.find()) {
    System.out.println(matcher.group());
}

答案 2 :(得分:3)

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

import string
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix
import nltk, nltk.classify.util, nltk.metrics
from nltk.classify import MaxentClassifier
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures
from nltk.probability import FreqDist, ConditionalFreqDist
from sklearn import cross_validation
import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews

from nltk.classify import MaxentClassifier
from nltk.corpus import movie_reviews
from nltk.corpus import movie_reviews as mr

stop = stopwords.words('english')
words = [([w for w in mr.words(i) if w.lower() not in stop and w.lower() not in string.punctuation], i.split('/')[0]) for i in mr.fileids()]

def word_feats(words):
 return dict([(word, True) for word in words])

negids = movie_reviews.fileids('neg')
posids = movie_reviews.fileids('pos')

negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
posfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'pos') for f in posids]

negcutoff = len(negfeats)*3/4
poscutoff = len(posfeats)*3/4

trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff]
DecisionTree_classifier = DecisionTreeClassifier.train(trainfeats, binary=True, depth_cutoff=20, support_cutoff=20, entropy_cutoff=0.01)
print(accuracy(DecisionTree_classifier, testfeats))

答案 3 :(得分:3)

我创建的这个函数检查给定的String是否只包含emojis。 换句话说,如果String包含正则表达式中未包含的任何字符,它将返回false。

$(function () {
    $('.radio-custom').each(function () {
        this.style.setProperty('background-color', 'yellow', 'important');
    });
});

实施示例:

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?)+");
}

给出的是一个在字符串上运行的函数(只有emojis)并返回其中的emojis数。 (借助我在StackOverFlow上找到的其他答案)。

答案 4 :(得分:2)

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

与Emoji 12.0(2018.10.15)兼容

简单于:

EmojiUtils.containsEmoji(str)

答案 5 :(得分:1)

给你 -

for (String word : sentence.split("")) {
    if (word.matches(emo_regex)) {
        System.out.println(word);
    }
}

答案 6 :(得分:0)

值得注意的是,Java代码可以用Unicode编写。所以你可以做:

@Test
public void containsEmoji_detects_smileys() {
    assertTrue(containsEmoji("This  is a smiley "));
    assertTrue(containsEmoji("This  is a different smiley"));
    assertFalse(containsEmoji("No smiley here"));
}

private boolean containsEmoji(String s) {
    String pattern = ".*[].*";
    return s.matches(pattern);
}

虽然请参阅:Should source code be saved in UTF-8 format,讨论这是否是一个好主意。

您可以使用String.codePoints()将字符串拆分为Java 8中的Unicode代码点,返回IntStream。这意味着您可以执行以下操作:

Set<Integer> emojis = new HashSet<>();
emojis.add("".codePointAt(0));
emojis.add("".codePointAt(0));
String s = "1345";
s.codePoints().forEach( codepoint -> {
    System.out.println(
        new String(Character.toChars(codepoint)) 
        + " " 
        + emojis.contains(codepoint));
});

...打印......

1 false
 true
3 false
4 false
 true
5 false

当然,如果你不想在你的代码中使用文字unicode字符,你可以在你的集合中输入数字:

emojis.add(0x1F601);