1. 概述

Emoji 在如今的文本交流中越来越常见,但有时候我们需要对文本进行清洗,去除这些 Emoji 表情和其他特殊符号。

本文将介绍几种在 Java 中从字符串中移除 Emoji 的方式,供日后查阅使用 ✅


2. 使用 Emoji 库

第一种方式是借助第三方库来处理 Emoji,这里我们使用 emoji-java 这个库。

首先在 pom.xml 中引入依赖:

<dependency>
    <groupId>com.vdurmont</groupId>
    <artifactId>emoji-java</artifactId>
    <version>4.0.0</version>
</dependency>

最新版本可在此处查看:Maven Repository - emoji-java

引入后,可以使用 EmojiParser.removeAllEmojis() 方法来移除字符串中的所有 Emoji:

@Test
public void whenRemoveEmojiUsingLibrary_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String result = EmojiParser.removeAllEmojis(text);

    assertEquals(result, "la conférence, commencera à 10 heures ");
}

还可以使用 parseToAliases() 方法将 Emoji 替换为其别名:

@Test
public void whenReplaceEmojiUsingLibrary_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String result = EmojiParser.parseToAliases(text);

    assertEquals(
      result, 
      "la conférence, commencera à 10 heures :sweat_smile:");
}

✅ 优点:简单粗暴,适合需要别名替换的场景
❌ 缺点:只能识别标准 Emoji,无法处理其他特殊符号


3. 使用正则表达式

如果不想引入额外依赖,可以使用正则表达式来清洗字符串。

我们可以保留字母、数字、标点和空格,其余字符一律清除:

@Test
public void whenRemoveEmojiUsingMatcher_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String regex = "[^\\p{L}\\p{N}\\p{P}\\p{Z}]";
    Pattern pattern = Pattern.compile(
      regex, 
      Pattern.UNICODE_CHARACTER_CLASS);
    Matcher matcher = pattern.matcher(text);
    String result = matcher.replaceAll("");

    assertEquals(result, "la conférence, commencera à 10 heures ");
}

正则表达式解释如下:

  • \\p{L}:所有语言的字母
  • \\p{N}:数字
  • \\p{P}:标点符号
  • \\p{Z}:空白字符
  • ^:表示取反,即只保留上述字符

也可以直接使用 String.replaceAll() 方法:

@Test
public void whenRemoveEmojiUsingRegex_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String regex = "[^\\p{L}\\p{N}\\p{P}\\p{Z}]";
    String result = text.replaceAll(regex, "");

    assertEquals(result, "la conférence, commencera à 10 heures ");
}

✅ 优点:无需依赖,控制力强
⚠️ 注意:某些特殊符号可能也会被误伤


4. 使用 Unicode 码点

另一种方式是直接通过 Unicode 码点匹配 Emoji。

我们可以使用 \x{十六进制码点} 来匹配特定 Emoji:

@Test
public void whenRemoveEmojiUsingCodepoints_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String result = text.replaceAll("[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}]", "");

    assertEquals(result, "la conférence, commencera à 10 heures ");
}

完整的 Emoji 码点列表可以参考:Full Emoji List - Unicode.org

✅ 优点:精准匹配,适合定制化需求
⚠️ 注意:需要维护 Emoji 码点范围,稍显繁琐


5. 使用 Unicode 转义(\u)

Java 中还可以使用 \u 表示 Unicode 字符,不过要注意一些 Emoji 需要两个 Java char(即代理对)来表示:

@Test
public void whenRemoveEmojiUsingUnicode_thenSuccess() {
    String text = "la conférence, commencera à 10 heures 😅";
    String result = text.replaceAll("[\ud83c\udf00-\ud83d\ude4f]|[\ud83d\ude80-\ud83d\udeff]", "");

    assertEquals(result, "la conférence, commencera à 10 heures ");
}

⚠️ 注意:这种方式可读性差,不推荐手动维护,适合生成代码使用


6. 小结

本文介绍了几种从 Java 字符串中移除 Emoji 的方法:

方法 依赖 精确度 推荐场景
emoji-java ✅ 有 ⭐⭐⭐⭐ 需要替换别名
正则表达式 ❌ 无 ⭐⭐⭐ 通用清洗
码点匹配 ❌ 无 ⭐⭐⭐⭐⭐ 精准控制
\u 转义 ❌ 无 ⭐⭐ 自动生成

完整代码示例可查看 GitHub 仓库:GitHub - core-java-string-algorithms


原始标题:Remove Emojis from a Java String