1. 概要

最近、絵文字はテキストメッセージングで人気が高まっています。絵文字やその他の記号から、テキストを削除する必要がある場合があります。

このチュートリアルでは、Javaの文字列から絵文字を削除するさまざまな方法について説明します。

2. 絵文字ライブラリの使用

まず、絵文字ライブラリを使用して、Stringから絵文字を削除します。

次の例ではemoji-java を使用するため、pom.xmlへの依存関係を確認する必要があります。

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

最新バージョンはここにあります。

次に、絵文字-java を使用して、文字列から絵文字を削除する方法を見てみましょう。

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

ここでは、 EmojiParser。のremoveAllEmojis()メソッドを呼び出しています。

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

このライブラリを使用すると、絵文字をエイリアスに置き換える必要がある場合に非常に便利です。

ただし、絵文字-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. コードポイントの使用

次に、コードポイントを使用して絵文字も検出します。 \ x {16進値}式を使用して、特定のUnicodeポイントに一致させることができます。

次の例では、Unicodeポイントを使用して2つの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 ");
}

現在利用可能な絵文字とそのコードポイントの完全なリストは、ここにあります。

6. Unicode範囲の使用

最後に、Unicodeを再度使用しますが、今回は \u式を使用します。

問題は、一部のUnicodeポイントが1つの16ビットJava文字に収まらないため、一部のUnicodeポイントには2文字が必要なことです。

\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文字列から絵文字を削除するさまざまな方法を学びました。 絵文字ライブラリ、正規表現、Unicode範囲を使用しました。

例の完全なソースコードは、GitHubにあります。