检查字母是否是表情符号
Check if letter is 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]);
}
}
它不添加带有任何表情符号的任何字母。我也尝试过使用 Matcher
和 Pattern
,但这也没有用。正则表达式有问题还是我的代码中遗漏了一些明显的东西?
我是这样收到信的:
sentence = "Jij staat op 10 "
String[] letters = sentence.split("");
最后一个应该被识别并添加到 emoticon
这些表情符号似乎有两个字符长,但是使用 split("")
你是在每个字符之间拆分,因此这些字母中的 none 个可以是你正在寻找的表情符号。
相反,您可以尝试拆分单词:
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());
}
您可以使用 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());
}
}
您可以使用 字符 class 来确定字母是否是代理项对的一部分。有一些有用的方法来处理代理对表情符号,例如:
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);
}
请记住,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 代码点,其中 returns 和 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);
我创建的这个函数检查给定的字符串是否只包含表情符号。
换句话说,如果字符串包含任何未包含在正则表达式中的字符,它将 return 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?)+");
}
实现示例:
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;
}
given 是一个在字符串(仅包含表情符号)和 return 其中的表情符号数量上运行的函数。 (借助我在 Whosebug 上找到的其他答案)。
试试这个项目simple-emoji-4j
兼容 Emoji 12.0 (2018.10.15)
简单:
EmojiUtils.containsEmoji(str)
给你 -
for (String word : sentence.split("")) {
if (word.matches(emo_regex)) {
System.out.println(word);
}
}
我想检查一个字母是否是表情符号。我发现了一些类似的问题,并找到了这个正则表达式:
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
这些表情符号似乎有两个字符长,但是使用 split("")
你是在每个字符之间拆分,因此这些字母中的 none 个可以是你正在寻找的表情符号。
相反,您可以尝试拆分单词:
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());
}
您可以使用 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());
}
}
您可以使用 字符 class 来确定字母是否是代理项对的一部分。有一些有用的方法来处理代理对表情符号,例如:
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);
}
请记住,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 代码点,其中 returns 和 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);
我创建的这个函数检查给定的字符串是否只包含表情符号。 换句话说,如果字符串包含任何未包含在正则表达式中的字符,它将 return 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?)+");
}
实现示例:
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;
}
given 是一个在字符串(仅包含表情符号)和 return 其中的表情符号数量上运行的函数。 (借助我在 Whosebug 上找到的其他答案)。
试试这个项目simple-emoji-4j
兼容 Emoji 12.0 (2018.10.15)
简单:
EmojiUtils.containsEmoji(str)
给你 -
for (String word : sentence.split("")) {
if (word.matches(emo_regex)) {
System.out.println(word);
}
}