Saya memiliki beberapa string dengan semua jenis emoji / gambar / tanda yang berbeda di dalamnya.
Tidak semua string dalam bahasa Inggris - beberapa dari mereka dalam bahasa non-Latin lainnya, misalnya:
▓ 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.❉
... dan masih banyak lagi.
Saya ingin menyingkirkan semua tanda / gambar ini dan hanya menyimpan huruf (dan tanda baca) dalam berbagai bahasa.
Saya mencoba membersihkan tanda-tanda menggunakan perpustakaan EmojiParser :
String withoutEmojis = EmojiParser.removeAllEmojis(input);
Masalahnya adalah EmojiParser tidak dapat menghapus sebagian besar tanda. Tanda ♦ adalah satu-satunya yang saya temukan sampai sekarang setelah dihapus. Tanda-tanda lain seperti ✪ ❉ ★ ✰ ❈ ❧ ✂ ❋ ⓡ ✿ ♛ 🔥 tidak dihapus.
Apakah ada cara untuk menghapus semua tanda-tanda ini dari string input dan hanya menyimpan huruf dan tanda baca dalam bahasa yang berbeda ?
Jawaban:
Alih-alih memasukkan beberapa elemen ke daftar hitam, bagaimana dengan membuat daftar putih karakter yang ingin Anda simpan? Dengan cara ini Anda tidak perlu khawatir tentang setiap emoji baru yang ditambahkan.
Begitu:
[\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]
adalah rentang yang mewakili semua angka (\\p{N}
), huruf (\\p{L}
), tanda (\\p{M}
), tanda baca (\\p{P}
), spasi putih / pemisah (\\p{Z}
), pemformatan lainnya (\\p{Cf}
) dan karakter lainU+FFFF
di atas dalam karakter Unicode (\\p{Cs}
), dan baris baru (\\s
).\\p{L}
khusus mencakup karakter dari huruf lain seperti Sirilik, Latin, Kanji, dll.^
dalam karakter regex meniadakan pertandingan.Contoh:
Jika Anda memerlukan informasi lebih lanjut, lihat dokumentasi Java untuk regex.
sumber
[^\w\^\-\[\]\.!@#$%&*\(\)/+'":;~?,]
tapi itu hanya saya yang kuat dan mencoba mengumpulkan semua karakter khas yang muncul adalah simbol). Terpilih karena ini jelas merupakan solusi potensial. Jika dia ingin menambahkan beberapa karakter bahasa lain, dia dapat menambahkannya ke ekspresi seperlunya.p{L}
menangani karakter alfabet non-Inggris . Saya harap ini dipahami bahwa saya tidak dapat mendaftar secara luas melalui setiap alfabet non-Inggris dalam jawaban saya karena itu akan menjadi tidak praktis."[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\s]"
. Ini memungkinkan kategori umum Surat, Tanda, Nomor, Tanda Baca, Pemisah, dan "Lainnya, Format", serta karakter spasi putih seperti tab dan baris baru.Saya tidak super ke Java, jadi saya tidak akan mencoba untuk menulis kode contoh inline, tetapi cara saya akan melakukan ini adalah untuk memeriksa apa yang disebut Unicode "kategori umum" dari setiap karakter. Ada beberapa huruf dan kategori tanda baca.
Anda dapat menggunakan Character.getType untuk menemukan kategori umum dari karakter yang diberikan. Anda mungkin harus mempertahankan karakter yang termasuk dalam kategori umum ini:
(Semua karakter yang Anda daftarkan secara spesifik ingin dihapus memiliki kategori umum
OTHER_SYMBOL
, yang tidak saya sertakan dalam daftar putih kategori di atas.)sumber
Character.getType()
tidak akan memberi tahu Anda apakahchar
(atauint
titik kode Anda karena metode ini kelebihan beban) adalah, katakanlah, sebuah emotikon, atau simbol musik, atau karakter emoji, dll. Jika Anda memiliki kasus penggunaan yang sederhana mungkin akan baik-baik saja untuk turun ke jalan ini - ini tentu saja merupakan pendekatan elegan yang mudah dipahami - tetapi perlu diketahui bahwa itu mungkin rusak jika persyaratan berubah.Berdasarkan Daftar Emoji Lengkap, v11.0 Anda memiliki 1644 poin kode Unicode yang berbeda untuk dihapus. Misalnya
✅
ada di daftar ini sebagaiU+2705
.Memiliki daftar lengkap emoji, Anda perlu memfilternya menggunakan poin kode . Iterasi lebih dari satu
char
ataubyte
tidak akan berfungsi sebagai titik kode tunggal dapat menjangkau beberapa byte. Karena Java menggunakan UTF-16 emoji biasanya akan memakan waktu duachar
detik.Memetakan dari titik kode Unicode
U+2705
ke Jawaint
secara langsung:atau karena Java mendukung Unicode Strings:
sumber
input.codePointAt
hanya melihat paling banyak 2 karakter yang merupakan batas atas yang konstan. Juga (yang baru ditambahkan)i += Character.charCount(cp)
melompati semua karakter yanginput.codePointAt
diperiksa (minus 1 dalam beberapa kasus sudut).String.chars()
stream lebih dari karakter bukan codepoint. Ada metode terpisahString.codePoints()
untuk itu.ICU4J adalah temanmu.
Ingatlah untuk selalu memperbarui versi icu4j Anda dan perhatikan ini hanya akan menyaring emoji Unicode resmi, bukan karakter simbol. Gabungkan dengan menyaring tipe karakter lain yang diinginkan.
Informasi lebih lanjut: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI
sumber
Saya memberikan beberapa contoh di bawah ini, dan berpikir bahwa bahasa Latin sudah cukup, tetapi ...
Setelah mengedit, mengembangkan solusi baru, menggunakan
Character.getType
metode, dan yang tampaknya menjadi cara terbaik untuk ini.Keluaran:
Kode berfungsi dengan mengalirkan String ke titik-kode. Kemudian menggunakan lambdas untuk memfilter karakter ke dalam
int
array, lalu kita mengubah array menjadi String.The huruf dan spasi menggunakan menggunakan metode Karakter untuk filter, tidak baik dengan tanda baca. Upaya gagal .
The blok unicode putih filter menggunakan blok unicode yang menspesifikasikan programmer sebagaimana diizinkan. Upaya gagal .
The blok unicode hitam filter menggunakan blok unicode yang menspesifikasikan programmer tidak diperbolehkan. Upaya gagal .
The kategori filter menggunakan metode statis
Character.getType
. Programmer dapat mendefinisikan dalamcategory
array tipe apa yang diperbolehkan. KARYA 😨😱😰😲😀.sumber
import java.lang.Character.UnicodeBlock;
, laluCharacter.UnicodeBlock
->UnicodeBlock
.white list
contohnya.Coba proyek ini simple-emoji-4j
Kompatibel dengan Emoji 12.0 (2018.10.15)
Sederhana dengan:
sumber
Gunakan plugin jQuery yang disebut RM-Emoji. Begini cara kerjanya:
Ini adalah mode cepat yang mungkin melewatkan beberapa emoji karena menggunakan algoritma heuristik untuk menemukan emoji dalam teks. Gunakan
.full()
metode ini untuk memindai seluruh string dan menghapus semua emoji yang dijamin.sumber