Remove Emojis from a Java String – 从Java字符串中删除表情符号

最后修改: 2018年 9月 5日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

Emojis are becoming more popular in text messaging these days – sometimes we need to clean our text from them and other symbols.

最近,表情符号在短信中越来越流行–有时我们需要从它们和其他符号中清理我们的文本。

In this tutorial, we’ll discuss different ways to remove emojis from a String in Java.

在本教程中,我们将讨论在Java中从String中移除emojis的不同方法。

2. Using Emoji Library

2.使用Emoji库

First, we’ll use an emoji library to remove the emojis from our String.

首先,我们将使用一个表情符号库,从我们的String中删除表情符号。

We’ll use emoji-java in the following example, so we need to this dependency to our pom.xml:

在下面的例子中,我们将使用emoji-java,所以我们需要将这个依赖关系加入我们的pom.xml

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

The latest version can be found here.

最新版本可以在这里找到。

Now let’s see how to use emoji-java to remove emojis from our String:

现在让我们看看如何使用emoji-java从我们的String中移除emojis。

@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 ");
}

Here, we’re calling the removeAllEmojis() method of EmojiParser.

在这里,我们调用了removeAllEmojis()方法,EmojiParser。

We can also use EmojiParser to replace emoji with its aliases using the parseToAliases() method:

我们还可以使用EmojiParser来使用parseToAliases()方法将表情符号替换为其别名。

@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:");
}

Note that using this library is very useful if we need to replace emoji with their aliases.

请注意,如果我们需要用表情符号的别名来替换它们,使用这个库就非常有用。

However, the emoji-java library will only detect emojis, but won’t be able to detect symbols or other special characters.

然而,emoji-java库只能检测emojis,但无法检测符号或其他特殊字符。

3. Using a Regular Expression

3.使用正则表达式

Next, we can use a regular expression to remove emojis and other symbols.
We’ll allow only specific types of characters:

接下来,我们可以使用正则表达式来删除表情符号和其他符号。
我们将只允许特定类型的字符。

@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 ");
}

Let’s break down our regular expression:

让我们来分解一下我们的正则表达式。

  • \p{L} – to allow all letters from any language
  • \p{N} – for numbers
  • \p{P} – for punctuation
  • \p{Z} – for whitespace separators
  • ^ is for negation, so all these expressions will be whitelisted

This expression will only keep letters, numbers, punctuation, and whitespace. We can customize the expression as we want to allow or remove more character types

该表达式将只保留字母、数字、标点符号和空白。我们可以根据自己的需要定制表达式,允许或删除更多的字符类型。

We can also use String.replaceAll() with the same regex:

我们也可以使用String.replaceAll(),并使用相同的regex。

@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 ");
}

5. Using Code Points

5.使用代码点

Now, we’ll also detect emojis using their code points. We can use \x{hexidecimal value} expression to match a specific Unicode point.

现在,我们还将使用它们的代码点来检测表情符号。我们可以使用 x{十六进制值}来匹配特定的Unicode点。表达式来匹配特定的Unicode点。

In the following example, we remove two Unicode ranges of emojis using their Unicode points:

在下面的例子中,我们使用表情符号的Unicode点来删除两个Unicode范围的表情符号。

@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 ");
}

The full list of currently available emojis and their code points can be found here.

目前可用的表情符号及其代码点的完整列表可以在这里找到。

6. Using Unicode Range

6.使用Unicode范围

Finally, we’ll use Unicode again but using the \u expression this time.

最后,我们将再次使用Unicode,但这次使用的是u表达。

The problem is that some Unicode points don’t fit in one 16bit Java character, so some of them need two characters.

问题是,有些Unicode点不适合于一个16位的Java字符,所以有些需要两个字符。

Here’s the corresponding expression using \u:

下面是使用u的相应表达。

@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 ");
}

7. Conclusion

7.结论

In this quick article, we learned different ways to remove emojis from a Java String. We used emoji library, regular expressions and Unicode ranges.

在这篇快速文章中,我们学习了从Java字符串中删除表情符号的不同方法。我们使用了表情符号库、正则表达式和Unicode范围。

The full source code for the examples can be found over on GitHub.

这些例子的完整源代码可以在GitHub上找到over