我想检查字母是否是表情符号。 我发现了一些类似的问题,并找到了这个正则表达式:

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:检查字母是否为表情符号相关推荐

  1. java检测工具_常用Java代码质量检测评估工具

    常用Java代码质量检测评估工具 1. PMD from http://pmd.sourceforge.net/ PMD能够扫描Java 源代码,查找类似以下的潜在问题: 可能的bug--try/ca ...

  2. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  3. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  4. java 月份缩写_关于java:如何将日期字符串解析为Date?

    本问题已经有最佳答案,请猛点这里访问. 如何将下面的日期字符串解析为Date对象? String target ="Thu Sep 28 20:29:30 JST 2000"; D ...

  5. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  6. java 分割一个_分割java

    [java]分割字符串工具类,霸气 jdk自带的 java 分割字符串,分割string,可以根据多个条件去分割.比如逗号,分号,逗号或者分号. 比如一个字符串:"abc,def;gh,ij ...

  7. java初始化数据报_初始化java原因

    虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...

  8. java 数据结构实例_数据结构(Java)——栈的实例

    惟大英雄能本色,是真名士自风流 --易中天(百家讲坛) 1.表达式的转换 1.1 中缀表达式转前缀表达式 中缀表达式转前缀表达式有许多的方式,有加括号去除法.语法树遍历法.堆栈处理法1. 测试程序的实 ...

  9. java applet配置_配置Java Applet的运行环境

    Java小程序,也就是Java Applet,可以在Web浏览器中运行.Java Applet必须以脚本的形式嵌入到HTML页面中,才能在web浏览器中运行. 之前总以为本地安装了JDK,指定好JAV ...

最新文章

  1. Windows中打开方式...无法指定程序的解决办法
  2. vsftp认证之pam_mysql
  3. android:windowBackground 和 android:background 的区别
  4. mdf与ldf文件如何还原到SQLserver数据库
  5. 005_控制器和动作
  6. Linux疑难杂症解决方案100篇(一)-静态链表全解析
  7. VTK:几何对象之ColoredLines
  8. 02-requests模块的概述
  9. 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
  10. spring boot web 开发示例
  11. Keil MDK编译器(V4.03)与J-LINK使用
  12. android connect 闪退,Connect闪退
  13. zsacm20120226省赛前个人赛第1场(结题报告)
  14. 虎头少保,天下第一手孙禄堂【转】
  15. bochs linux使用教程,bochs 在linux下的安装
  16. 解决Google浏览器中Flash插件禁用问题
  17. python 拼音排序_Python实现针对中文排序的方法
  18. linux的input命令,Linux(Ubuntu)下如何修改鼠标速度——”xinput”命令使用方法
  19. 苹果吃鸡用什么蓝牙耳机好?苹果吃鸡低延迟蓝牙耳机品牌推荐
  20. python分形曲线代码_Python:绘制L-System的分形图

热门文章

  1. 华为WLAN基础全套学习笔记整理
  2. 聊天机器人:DeepMind的sparrow
  3. 平均数编码:针对高基数定性特征(类别特征)的数据预处理/特征工程
  4. 165页最全银行IT核心系统研究框架
  5. class AdamWeightDecayOptimizer(tf.train.Optimizer): AttributeError: module ‘tensorflow._api.v2.tra
  6. 前后台系统和RTOS系统的区别
  7. log4jdbc-log4j2浅析(sqlfx客户端采集日志的来源)-java 输出sql执行时间
  8. python爬取网易云歌单
  9. 开发利器IntelliJ IDEA—带你体验各种神奇操作
  10. Linux 密码 shadow