Удалить Emojis из строки Java

1. Обзор

В наши дни эмодзи становятся все более популярными в текстовых сообщениях - иногда нам нужно очистить наш текст от них и других символов.

В этом руководстве мы обсудим различные способы удаления смайликов из String в Java.

2. Использование библиотеки Emoji

Во-первых, мы будем использовать библиотеку эмодзи для удаления смайликов из нашей Строки .

Мы будем использовать emoji-java в следующем примере, поэтому нам нужна эта зависимость от нашего pom.xml

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

Последнюю версию можно найти here

Теперь давайте посмотрим, как использовать _emoji-java для удаления смайликов из нашей String_ :

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

Здесь мы вызываем метод removeAllEmojis () EmojiParser .

Мы также можем использовать EmojiParser для замены emoji его псевдонимами, используя метод 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:");
}

Обратите внимание, что использование этой библиотеки очень полезно, если нам нужно заменить emoji их псевдонимами.

Тем не менее, библиотека emoji-java будет обнаруживать только эмодзи, но не сможет обнаружить символы или другие специальные символы.

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

5. Использование Code Points

Теперь мы также обнаружим смайлики, используя их кодовые точки. Мы можем использовать выражение \ x \ {шестнадцатеричное значение} для соответствия определенной точке Unicode.

В следующем примере мы удаляем два диапазона смайликов 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 ");
}

Полный список доступных на данный момент смайликов и их кодовые точки можно найти по адресу here .

6. Использование Unicode Range

Наконец, мы снова будем использовать Unicode, но на этот раз будем использовать выражение \ u .

Проблема в том, что некоторые точки Unicode не вписываются в один 16-битный символ Java, поэтому для некоторых из них нужны два символа.

Вот соответствующее выражение, использующее \ 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. Заключение

В этой быстрой статье мы узнали о различных способах удаления смайликов из строки Java. Мы использовали библиотеку эмодзи, регулярные выражения и диапазоны Юникода.

Полный исходный код для примеров можно найти over на GitHub .