7.2.3 QQ表情的识别

在掌握了QQ表情的发送之后,再来看看公众账号如何识别QQ表情。也就是说,当用户向公众账号发送一个QQ表情时,在后台程序中接收到的会是什么值,我们又怎么知道这个值是一个QQ表情。其实,只要将接收到的文本消息输出到日志中(使用SLF4J),不难发现:向公众账号发送QQ表情,公众账号后台接收到的是QQ表情的符号代码(见表7-1)。

接下来,我们运用正则表达式编写一个用于识别用户发送的文本消息是不是单个QQ表情的方法,该方法的实现如下:

  1. 1  /**
  2. 2  * 判断是不是QQ表情
  3. 3  *
  4. 4  * @param content 文本消息内容
  5. 5  * @return true|false
  6. 6  */
  7. 7  public static boolean isQqFace(String content) {
  8. 8  boolean result = false;
  9. 9
  10. 10  // 判断QQ表情的正则表达式
  11. 11  String qqFaceRegex =
  12. 12 "/::\\)|/::~|/::B|/::\\||/:8-\\)|/::<|/::$|/::X|/::Z|/::'\\(|/::-\\||/::@|/::P|
  13. 13 /::D|/::O|/::\\(|/::\\+|/:--b|/::Q|/::T|/:,@P|/:,@-D|/::d|/:,@o|/::g|/:\\|-\\)|/::!|/
  14. 14 ::L|/::>|/::,@|/:,@f|/::-S|/:\\?|/:,@x|/:,@@|/::8|/:,@!|/:!!!|/:xx|/:bye|/:wipe|/
  15. 15 :dig|/:handclap|/:&-\\(|/:B-\\)|/:<@|/:@>|/::-O|/:>-\\||/:P-\\(|/::'\\||/:X-\\)|/
  16. 16 ::\\*|/:@x|/:8\\*|/:pd|/:<W>|/:beer|/:basketb|/:oo|/:coffee|/:eat|/:pig|/:rose|/:fade|/
  17. 17 :showlove|/:heart|/:break|/:cake|/:li|/:bome|/:kn|/:footb|/:ladybug|/:shit|/:moon|/
  18. 18 :sun|/:gift|/:hug|/:strong|/:weak|/:share|/:v|/:@\\)|/:jj|/:@@|/:bad|/:lvu|/:no|/:ok|/
  19. 19 :love|/:<L>|/:jump|/:shake|/:<O>|/:circle|/:kotow|/:turn|/:skip|/:oY|/:#-0|/
  20.  :hiphot|/:kiss|/:<&|/:&>";
  21. 20  Pattern p = Pattern.compile(qqFaceRegex);
  22. 21  Matcher m = p.matcher(content);
  23. 22  if (m.matches()) {
  24. 23  result = true;
  25. 14  }
  26. 25  return result;
  27. 26  }

代码中的第11~19行通过QQ表情的符号代码定义了识别单个QQ表情的规则。第20~25行代码通过正则表达式进行判断,最后返回一个boolean类型的结果。