Regex para eliminar el número de pista del nombre de la canción?
Tengo un ListView que muestra nombres de canciones y artistas. A veces, los nombres de las canciones contienen el número de pista y un separador con algunos en este formato
13 - J. Cole - Best Friend
Y otros como este
- RegEx para encontrar URL en HTML tarda 25 segundos en Java / Android
- Cómo colorear texto utilizando Regex en android
- PHP - RegEx Números de teléfono con o sin código de país
- Problema que coincide con el patrón regex en Android
- Consulta de SQLiteDatabase de Android con Regex
13 - Beautiful People
Después de algunos cavar alrededor me encontré con que la mejor manera de ir sobre esto es definir un patrón regex que eliminará cualquier carácter innecesario en la cadena. Guay. He mirado otras preguntas SO en un tema similar aquí y un par de entradas de blog, pero aún no hay suerte.
Esta es mi primera vez que se ocupan de las expresiones regulares y me parece muy útil, sólo tratando de envolver mi cabeza alrededor de venir con patrones eficientes / útiles.
Esto es lo que necesito quitar de la cadena si es un partido
The track number The "-" or whatever separator character that follows it The artist name and the "-" that follows that(Each artist name is listed below the song, so it would be redundant)
Cualquier ayuda en esto sería muy apreciada como de costumbre chicos, gracias!
Edit: La misma salida que me gustaría es algo como esto, con sólo los nombres de las canciones. No hay números de pista, y si es aplicable; Ningún nombre de artista siguiendo el "-"
Beautiful People Angel of Mine Human Nature
- ¿Cómo puedo eliminar el "+" y el código del país de un número de teléfono?
- ¿Cómo lograr límite de palabras en Sqlite Android?
- Grupos java regex con android
- cómo encontrar si el texto de entrada es una url usando regex
- java.util.regex.PatternSyntaxException: Error de sintaxis en patrón regex cerca de índice
- Excluir etiquetas HTML y algunos caracteres UNICODE mientras busca en SQLite
- Regex no funciona en Android pero funciona bien en Java
- Identificar el tipo de patrón de regex
Esta es una posible expresión regular que podría usar:
name.replaceFirst("^\\d+\\.?\\s*-(?:.*?-)?\\s*", "")
Esto saca lo siguiente:
- Dígitos en la parte delantera
- Opcionalmente seguido por un punto
- Opcionalmente espacios
- Un guión
- Si se encuentra un guión más, entonces todo hasta ese
- Opcionalmente espacios
Un pedazo de código será mejor para darle una pista:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String[] songNames = { "1 - my awesome artist - go beyond", "2 - such is life", "My awesome song" }; Pattern trackNumberPattern = Pattern.compile("^ *\\d+ *- *"); Pattern artistPattern = Pattern.compile(" *- *[^-]+ *- *"); Matcher matcher; for(String song: songNames) { matcher = trackNumberPattern.matcher(song); if(matcher.find()) { song = matcher.replaceFirst(""); } matcher = artistPattern.matcher(song); if(matcher.find()) { song = matcher.replaceFirst(""); } System.out.println(">>> " + song); } } }
Puede encontrar el documento para escribir regex en java aquí: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
AVISO: Esto no funcionará correctamente si algunos de los nombres de canciones o nombres de artista contienen guiones (-), etc …
Puedes usar este regex (un poco radical):
^\\d*+\\W*+\\b(?>[^-]++-\\s++(?=\w))?
Y reemplazarlo por nada.
Esto destruirá todos los dígitos seguidos por los caracteres no-palabra en el principio, y el nombre de intérprete si está presente