日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 检测表情符号_关于Java:检查字母是否为表情符号

發布時間:2023/12/8 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 检测表情符号_关于Java:检查字母是否为表情符号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我想檢查字母是否是表情符號。 我發現了一些類似的問題,并找到了這個正則表達式:

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

但是,當我在如下語句中執行以下操作時:

for (int k=0; k

if (letters[k].matches(emo_regex)) {

emoticon.add(letters[k]);

}

}

它不會在任何表情符號中添加任何字母。 我也嘗試過使用Matcher和Pattern,但這都不起作用。 正則表達式是否有問題,或者我的代碼中缺少明顯的東西?

這是我的來信:

sentence ="Jij staat op 10 ??"

String[] letters = sentence.split("");

最后 ?? 應該被識別并添加到emoticon

您可以向我們展示更多代碼嗎? 循環似乎還不錯...

您能否提供期望匹配的letters值的具體示例? 另外,是什么讓您有信心,您找到的正則表達式絕對正確且全面?

如果我是正確的,表情符號有兩個字母

我完全不了解您的方法。 您是否將原始字符串拆分為String[],每個元素都是一個單字符字符串,只是為了能夠應用正則表達式而不是普通Java數字范圍檢查?

編輯了問題以顯示我如何得到這封信!

可能相關:stackoverflow.com/questions/24840667

您可以使用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());

}

}

我創建的此函數檢查給定的String是否僅包含表情符號。

換句話說,如果字符串包含正則表達式中未包含的任何字符,則它將返回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;

}

給定的函數在字符串(僅包含表情符號)上運行并返回其中的表情符號數量。 (借助于我在StackOverFlow上找到的其他答案的幫助)。

我對正則表達式很熟悉,但是它是如此復雜,以至于我真的不明白您在做什么。

您可以使用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);

}

這不起作用,不應該使用,因為某些表情符號僅包含一個字符,例如"?"。length()為1。應該被否決,但當前不具有我的特權。

"?" 不是表情符號。 它只是一個符號,但是系統將其顯示為表情符號。 值是9760。

這些表情符號似乎有兩個字符長,但是使用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個字符,這將有所幫助

@bdv似乎為我工作(使用第二種方法)。 還是這應該是一個(復合)表情符號?

不,兩個單獨的。。您如何測試?

@bdv使用String sentence ="zing ????. It he";(只是從您的注釋中復制),您的模式以及然后以Matcher開頭的代碼進行測試。 它輸出兩個表情符號。

謝謝,匹配器工作!

試試這個項目simple-emoji-4j

兼容Emoji 12.0(2018.10.15)

簡單:

EmojiUtils.containsEmoji(str)

值得牢記的是,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);

}

盡管請參閱:應該將源代碼保存為UTF-8格式,以討論是否是一個好主意。

您可以使用String.codePoints()在Java 8中將String拆分為Unicode代碼點,這將返回IntStream。這意味著您可以執行以下操作:

Set emojis = new HashSet<>();

emojis.add("??".codePointAt(0));

emojis.add("??".codePointAt(0));

String s ="1??34??5";

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);

糟糕的解決方案

有見地......

總結

以上是生活随笔為你收集整理的java 检测表情符号_关于Java:检查字母是否为表情符号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。