Java中如何检测字符串是否包含表情符号?
Java 识别字符串中的表情符号:更全面的正则方案
你之前用的正则只覆盖了部分Unicode表情区块,像🥰、🥲这类属于Supplemental Symbols and Pictographs(U+1F900-U+1F9FF)的表情没被包含,所以检测不到。
下面是覆盖绝大多数标准表情符号的正则表达式,包含了所有主流的Emoji相关Unicode区块,还支持组合表情的零宽连接符:
private static final String EMOJI_REGEX = "([\\u2600-\\u26FF]|[\\u2700-\\u27BF]|[\\uE000-\\uF8FF]|[\\u1F300-\\u1F5FF]|[\\u1F600-\\u1F64F]|[\\u1F680-\\u1F6FF]|[\\u1F700-\\u1F77F]|[\\u1F780-\\u1F7FF]|[\\u1F800-\\u1F8FF]|[\\u1F900-\\u1F9FF]|[\\u1FA00-\\u1FA6F]|[\\u1FA70-\\u1FAFF]|[\\u200D])";
正则范围说明
每个子范围对应一个Unicode表情/符号区块:
\u2600-\u26FF:杂项符号\u2700-\u27BF:装饰符号\uE000-\uF8FF:私有使用区(兼容部分旧表情)\u1F300-\u1F5FF:杂项符号与象形文字\u1F600-\u1F64F:表情符号\u1F680-\u1F6FF:交通与地图符号\u1F700-\u1F77F:炼金术符号\u1F780-\u1F7FF:几何图形扩展\u1F800-\u1F8FF:补充箭头-C\u1F900-\u1F9FF:补充符号与象形文字(包含你提到的🥰、🥲)\u1FA00-\u1FA6F:符号与象形文字扩展-A\u1FA70-\u1FAFF:符号与象形文字扩展-B\u200D:零宽连接符(用于拼接组合表情,如👨👩👧👦)
实用代码示例
直接用这个正则封装检测方法:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class EmojiDetector { private static final String EMOJI_REGEX = "([\\u2600-\\u26FF]|[\\u2700-\\u27BF]|[\\uE000-\\uF8FF]|[\\u1F300-\\u1F5FF]|[\\u1F600-\\u1F64F]|[\\u1F680-\\u1F6FF]|[\\u1F700-\\u1F77F]|[\\u1F780-\\u1F7FF]|[\\u1F800-\\u1F8FF]|[\\u1F900-\\u1F9FF]|[\\u1FA00-\\u1FA6F]|[\\u1FA70-\\u1FAFF]|[\\u200D])"; private static final Pattern EMOJI_PATTERN = Pattern.compile(EMOJI_REGEX); public static boolean containsEmoji(String input) { if (input == null || input.isBlank()) { return false; } Matcher matcher = EMOJI_PATTERN.matcher(input); return matcher.find(); } public static void main(String[] args) { System.out.println(containsEmoji("Hello 🥰 World")); // 输出 true System.out.println(containsEmoji("纯文本内容")); // 输出 false System.out.println(containsEmoji("组合表情👨👩👧")); // 输出 true } }
额外扩展
如果需要识别带有肤色修饰的表情(如👨🏿),可以在正则里加上肤色修饰符范围:|[\\u1F3FB-\\u1F3FF],更新后的正则会兼容这类带修饰的表情。
内容的提问来源于stack exchange,提问作者user24492691
相关产品推荐
相关产品推荐

