División de la cadena con RegEx en Android

He estado intentando dividir las Strings usando RegEx sin éxito. La idea es dividir un metadato de archivo de música dado de su nombre de archivo de una manera que:

 "01. Kodaline - Autopilot.mp3" 

resultaría en

 metadata[0] = "01" metadata[1] = "Kodaline" metadata[2] = "Autopilot" 

Este es el RegEx que he estado tratando de usar en su forma original:

 ^(.*)\.(.*)\-(.*)\.(mp3|flac) 

De lo que he leído, necesito dar formato al RegEx para String.split(String regex) para trabajar. Así que aquí está mi formato RegEx:

 ^(.*)\\.(.*)\\-(.*)\\.(mp3|flac) 

..y esto es lo que mi código parece:

 String filename = "01. Kodaline - Autopilot.mp3"; String regex = "^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)"; String[] metadata = filename.split(regex); 

Pero no estoy recibiendo el resultado que esperaba. ¿Me puedes ayudar con esto?

Su regex está bien para hacer coincidir la cadena de entrada. Su problema es que utilizó split() , que espera un regex con un propósito totalmente diferente. Para split() , la regex que se da coincide con los delimitadores (separadores) que separan partes de la entrada; no coinciden con la entrada entera. Así, en una situación diferente (no en su situación), podría decir

 String[] parts = s.split("[\\- ]"); 

El regex coincide con un carácter que es un guión o un espacio. Así que esto buscará guiones y espacios en su cadena y devolverá las partes separadas por guiones y espacios.

Para utilizar su regex para que coincida con la cadena de entrada, necesita algo como esto:

 String filename = "01. Kodaline - Autopilot.mp3"; String regex = "^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(filename); String[] metadata = new String[4]; if (matcher.find()) { metadata[0] = matcher.group(1); // in real life I'd use a loop metadata[1] = matcher.group(2); metadata[2] = matcher.group(3); metadata[3] = matcher.group(4); // the rest of your code } 

que pone los metadata en las cadenas "01" , " Kodaline " , " Autopilot" , "mp3" , que está cerca de lo que quieres, excepto tal vez para espacios adicionales (que puedes buscar en tu regex). Desafortunadamente, no creo que haya una función Matcher incorporada que devuelva todos los grupos en una matriz.

(A propósito, en su regex, usted no necesita los backslashes delante de - , pero son inofensivos, así que los dejé adentro. El - no tiene normalmente un significado especial, así que no necesita Sin embargo, en el interior de los corchetes, un guión es especial, por lo que debe usar barras invertidas si desea coincidir con un conjunto de caracteres y un guión es uno de esos caracteres, por eso usé barras invertidas en el ejemplo de split arriba.

esto funcionó para mí

 str.split("\\.\\s+|\\s+-\\s+|\\.(mp3|flac)"); 

Intente algo como:

 String filename = "01. Kodaline - Autopilot.mp3"; String fileWithoutExtension = filename.substring(0, filename.lastIndexOf('.')); System.out.println(Arrays.toString(fileWithoutExtension.replaceAll("[^\\w\\s]", "").split("\\s+"))); Output: [01, Kodaline, Autopilot] 
  • Regex para eliminar espacios entre números solamente
  • La división de una cadena funciona en Java, no funciona en Android
  • ¿Cómo usar los marcadores de principio y fin en regex para Java String?
  • Android, String.split (String regex) no divide toda la cadena
  • Android / Java: comprueba si url es url válida de youtube
  • java.util.regex.PatternSyntaxException: Error de sintaxis en patrón regex cerca de índice
  • Regex <img> Análisis de etiquetas con src, width, height
  • ¿Cómo lograr límite de palabras en Sqlite Android?
  • Regex no funciona en Android pero funciona bien en Java
  • Formato de registro de registro de Android c2dm
  • ReplaceAll no reemplaza string
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.