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