我想检查一封信是否是表情符号。我已经找到了一些类似的问题并找到了这个正则表达式:
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]);
}
}
它不会添加任何表情符号的任何字母。我还尝试使用Matcher
和Pattern
,但这也无效。正则表达式有什么问题,或者我在代码中遗漏了哪些东西?
这就是我收到这封信的方式:
sentence = "Jij staat op 10 "
String[] letters = sentence.split("");
应该识别最后一个并添加到emoticon
答案 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);
}
}
但当然这会错过与单词或标点符号相关的表情符号。
或者,您可以在与正则表达式匹配的句子中使用Matcher
到find
任意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)
答案 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);