1. ホーム
  2. java

[解決済み】Javaの文字列から✅、✈、♛などの絵文字/画像/記号を削除する

2022-04-12 18:36:01

質問

いろいろな絵文字や画像や記号が入った文字列があるのですが、どうしたらいいですか?

すべての文字列が英語というわけではなく、たとえばラテン語以外の言語もあります。

▓ railway??
→ Cats and dogs
I'm on ????
Apples ⚛ 
✅ Vi sign
♛ I'm the king ♛ 
Corée ♦ du Nord ☁  (French)
 gjør at både ◄╗ (Norwegian)
Star me ★
Star ⭐ once more
早上好 ♛ (Chinese)
Καλημέρα ✂ (Greek)
another ✓ sign ✓
добрай раніцы ✪ (Belarus)
◄ शुभ प्रभात ◄ (Hindi)
✪ ✰ ❈ ❧ Let's get together ★. We shall meet at 12/10/2018 10:00 AM at Tony's.❉

...その他にもたくさんあります。

これらの標識・画像をすべて取り除き、各言語の文字(と句読点)だけを残すようにしたいです。

を使って看板のクリーニングを試みました。 EmojiParser ライブラリ :

String withoutEmojis = EmojiParser.removeAllEmojis(input);

問題は、EmojiParserが大半の符号を除去できないことです。今まで見つけた中で削除されたのは♦記号だけです。 他の記号、例えば❉ ★ ✰ ❈ ❧ ✂ ❋ ?♛は削除されません。

入力文字列からこれらの記号をすべて削除し、文字と句読点だけを残して 異なる言語 ?

解決方法は?

いくつかの要素をブラックリスト化する代わりに、残しておきたい文字のホワイトリストを作成するのはどうでしょうか?そうすれば、新しい絵文字が追加されるたびに心配する必要はありません。

String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");

だから

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] は、すべての数値 ( \\p{N} )、文字( \\p{L} ), マーク ( \\p{M} ), 句読点 ( \\p{P} )、ホワイトスペース/セパレータ( \\p{Z} ), その他の書式設定 ( \\p{Cf} ) 以上の文字 U+FFFF ユニコードで( \\p{Cs} )、改行( \\s ) 文字を使用します。 \\p{L} 具体的には は、キリル文字、ラテン文字、漢字など、他のアルファベットの文字も含みます。
  • ^ はマッチを否定します。

String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。????";
System.out.print(str.replaceAll("[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]",""));
// Output:
//   "hello world _# 皆さん、こんにちは! 私はジョンと申します。"

より詳細な情報が必要な場合は、Javaをチェックしてください。 ドキュメント は正規表現です。