especiales caracteres array java regex split tokenize

caracteres - split string java 8



Error de Tokenización: java.util.regex.PatternSyntaxException, metacarácter colgado ''*'' (4)

Esto se debe a que * se utiliza como un metacarácter para indicar una o más apariciones del carácter anterior. Así que si escribo M * entonces buscaré archivos MMMMMM ...! Aquí estás usando * como el único carácter por lo que el compilador está buscando el personaje para encontrar múltiples apariciones, por lo que lanza la excepción. :)

Estoy usando split() para tokenizar una cadena separada con * siguiendo este formato:

name*lastName*ID*school*age % name*lastName*ID*school*age % name*lastName*ID*school*age

Estoy leyendo esto desde un archivo llamado "entrada.al" usando este código:

static void leer() { try { String ruta="entrada.al"; File myFile = new File (ruta); FileReader fileReader = new FileReader(myFile); BufferedReader reader = new BufferedReader(fileReader); String line = null; while ((line=reader.readLine())!=null){ if (!(line.equals("%"))){ String [] separado = line.split("*"); //SPLIT CALL names.add(separado[0]); lastNames.add(separado[1]); ids.add(separado[2]); ages.add(separado[3]); } } reader.close(); }

Y estoy recibiendo esta excepción:

Excepción en el subproceso "main" java.util.regex.PatternSyntaxException: carácter de metadatos colgando ''*'' cerca del índice 0 *

Supongo que la falta de un * después de la edad en el archivo de texto original está causando esto. ¿Cómo me las arreglo?


La primera respuesta lo cubre.

Supongo que en algún lugar de la línea puede decidir almacenar su información en una clase / estructura diferente. En ese caso, probablemente no querrá que los resultados ingresen a una matriz desde el método split ().

No lo pediste, pero estoy aburrido, así que aquí hay un ejemplo, espero que sea útil.

Esta podría ser la clase que escribes para representar a una sola persona:

class Person { public String firstName; public String lastName; public int id; public int age; public Person(String firstName, String lastName, int id, int age) { this.firstName = firstName; this.lastName = lastName; this.id = id; this.age = age; } // Add ''get'' and ''set'' method if you want to make the attributes private rather than public. }

Luego, la versión del código de análisis que originalmente publicaste se vería así: (Esto los almacena en una lista enlazada, puedes usar algo más como un Hashtable, etc.)

try { String ruta="entrada.al"; BufferedReader reader = new BufferedReader(new FileReader(ruta)); LinkedList<Person> list = new LinkedList<Person>(); String line = null; while ((line=reader.readLine())!=null) { if (!(line.equals("%"))) { StringTokenizer st = new StringTokenizer(line, "*"); if (st.countTokens() == 4) list.add(new Person(st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken))); else // whatever you want to do to account for an invalid entry // in your file. (not 4 ''*'' delimiters on a line). Or you // could write the ''if'' clause differently to account for it } } reader.close(); }


No, el problema es que * es un carácter reservado en expresiones regulares, por lo que necesita escapar de él.

String [] separado = line.split("//*");

* significa "cero o más de la expresión anterior" (consulte los Javadocs de Pattern ), y no le dio ninguna expresión anterior, lo que hace que su expresión dividida sea ilegal. Es por esto que el error fue una PatternSyntaxException .


Tuve un problema similar con regex = "?" . Sucede para todos los caracteres especiales que tienen algún significado en una expresión regular. Por lo tanto, debe tener "//" como prefijo en su expresión regular.

String [] separado = line.split("//*");