Tengo algunas cadenas con todo tipo de diferentes emojis / imágenes / signos en ellas.
No todas las cadenas están en inglés; algunas están en otros idiomas no latinos, por ejemplo:
▓ 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.❉
... y muchos más de estos.
Me gustaría deshacerme de todos estos signos / imágenes y mantener solo las letras (y la puntuación) en los diferentes idiomas.
Traté de limpiar los signos usando la biblioteca EmojiParser :
String withoutEmojis = EmojiParser.removeAllEmojis(input);
El problema es que EmojiParser no puede eliminar la mayoría de los signos. El signo ♦ es el único que encontré hasta ahora que se eliminó. Otros signos como ✪ ❉ ★ ✰ ❈ ❧ ✂ ❋ ⓡ ✿ ♛ 🔥 no se eliminan.
¿Hay alguna manera de eliminar todos estos signos de las cadenas de entrada y mantener solo las letras y la puntuación en los diferentes idiomas ?
Respuestas:
En lugar de incluir en la lista negra algunos elementos, ¿qué le parece crear una lista blanca de los personajes que desea conservar? De esta manera, no necesita preocuparse por cada nuevo emoji que se agregue.
Entonces:
[\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]
es un rango que representa todos los caracteres numéricos (\\p{N}
), letras (\\p{L}
), marcas (\\p{M}
), signos de puntuación (\\p{P}
), espacios en blanco / separadores (\\p{Z}
), otros formatos (\\p{Cf}
) y otros caracteres anterioresU+FFFF
en Unicode (\\p{Cs}
) y caracteres de nueva línea (\\s
).\\p{L}
Incluye específicamente los caracteres de otros alfabetos como cirílico, latín, kanji, etc.^
conjunto de caracteres en la expresión regular niega la coincidencia.Ejemplo:
Si necesita más información, consulte la documentación de Java para expresiones regulares.
fuente
[^\w\^\-\[\]\.!@#$%&*\(\)/+'":;~?,]
eso, pero solo soy robusto e intento reunir todos los caracteres típicos que no son 't símbolos). Votado porque definitivamente es una solución potencial. Si quiere agregar otros caracteres del lenguaje, puede agregarlos a la expresión según sea necesario.p{L}
maneja caracteres alfabéticos que no están en inglés . Espero que se entienda que no puedo enumerar extensamente a través de cada alfabeto que no esté en inglés en mi respuesta, ya que eso sería poco práctico."[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\s]"
. Esto permite las categorías generales Letra, Marca, Número, Puntuación, Separador y "Otro, Formato", así como los espacios en blanco como tabulación y nueva línea.No estoy muy interesado en Java, por lo que no intentaré escribir código de ejemplo en línea, pero la forma en que lo haría es verificar lo que Unicode llama "la categoría general" de cada carácter. Hay un par de letras y categorías de puntuación.
Puede usar Character.getType para encontrar la categoría general de un personaje dado. Probablemente debería retener los caracteres que se encuentran en estas categorías generales:
(Todos los caracteres que enumeró como que desea eliminar específicamente tienen categoría general
OTHER_SYMBOL
, que no incluí en la lista blanca de la categoría anterior).fuente
Character.getType()
no le dirá si suchar
(oint
punto de código ya que el método está sobrecargado) es, por ejemplo, un emoticón o un símbolo musical, o un personaje emoji, etc. Si tiene un caso de uso simple, podría estar bien seguir este camino, sin duda es un enfoque elegante que es fácil de comprender, pero tenga en cuenta que podría romperse si cambian los requisitos.Basado en la lista completa de Emoji, v11.0 tiene 1644 puntos de código Unicode diferentes para eliminar. Por ejemplo
✅
está en esta lista comoU+2705
.Tener la lista completa de emojis necesita filtrarlos usando puntos de código . Iterar sobre solo
char
obyte
no funcionará como punto de código único puede abarcar múltiples bytes. Debido a que Java usa emojis UTF-16, generalmente tomará doschar
segundos.El mapeo desde el punto de código Unicode
U+2705
a Javaint
es sencillo:o como Java admite cadenas Unicode:
fuente
input.codePointAt
solo mira hasta 2 caracteres como máximo, lo que es un límite superior constante. Además (el recién agregado)i += Character.charCount(cp)
omite todos los caracteres queinput.codePointAt
inspeccionaron (menos 1 en algunos casos de esquina).String.chars()
transmite sobre caracteres no puntos de código. Hay un método separadoString.codePoints()
para eso.ICU4J es tu amigo.
Recuerde mantener su versión de icu4j actualizada y tenga en cuenta que esto solo filtrará los emoji Unicode oficiales, no los caracteres de símbolos. Combine con el filtrado de otros tipos de caracteres como desee.
Más información: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI
fuente
Di algunos ejemplos a continuación, y pensé que el latín es suficiente, pero ...
Después de editar, desarrolló una nueva solución, utilizando el
Character.getType
método, y esa parece ser la mejor opción para esto.Salida:
El código funciona transmitiendo la cadena a los puntos de código. Luego, usando lambdas para filtrar caracteres en un
int
matriz, luego convertimos la matriz a Cadena.Las letras y los espacios se utilizan utilizando los métodos de Carácter para filtrar, no son buenos con la puntuación. Intento fallido .
El Unicode bloquea el filtro blanco utilizando los bloques Unicode que el programador especifica como permitidos. Intento fallido .
El Unicode bloquea el filtro negro utilizando los bloques Unicode que el programador especifica como no permitidos. Intento fallido .
El filtro de categoría con el método estático
Character.getType
. El programador puede definir en lacategory
matriz qué tipos están permitidos. FUNCIONA 😨😱😰😲😀.fuente
import java.lang.Character.UnicodeBlock;
, entoncesCharacter.UnicodeBlock
->UnicodeBlock
.white list
ejemplo.Prueba este proyecto simple-emoji-4j
Compatible con Emoji 12.0 (2018.10.15)
Simple con:
fuente
Use un complemento jQuery llamado RM-Emoji. Así es como funciona:
Este es el modo rápido que puede perder algunos emojis, ya que utiliza algoritmos heurísticos para encontrar emojis en el texto. Use el
.full()
método para escanear toda la cadena y eliminar todos los emojis garantizados.fuente