Error de tokenización: java.util.regex.patternsyntaxexception, colgando metacharacter '*'

StackOverflow https://stackoverflow.com/questions/917822

  •  06-09-2019
  •  | 
  •  

Pregunta

estoy usando split() 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 obteniendo esta excepción:

Excepción en el hilo "principal" java.util.regex.patternsyntaxException: colgando meta carácter ' *' 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 lo sigo?

¿Fue útil?

Solución

No, el problema es que * es un personaje reservado en reglas, por lo que debe escapar de él.

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

* significa "cero o más de la expresión anterior" (ver el Pattern Javadocs), y no le estaba dando ninguna expresión previa, haciendo que su expresión dividida sea ilegal. Por eso el error fue un PatternSyntaxException.

Otros consejos

Tuve un problema similar con regex = "?". Sucede para todos los personajes especiales que tienen algún significado en una regex. Entonces necesitas tener "\\" como prefijo de tu regex.

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

La primera respuesta lo cubre.

Supongo que en algún lugar en el futuro puede decidir almacenar su información en una clase/estructura diferente. En ese caso, probablemente no quiera que los resultados entraran en una matriz desde el método Split ().

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

Esta podría ser la clase que escribe 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 publicó originalmente se vería algo así: (esto los almacena en una lista de enlaces, podría 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();
}

Es porque * se usa como metacharacter para significar una o más ocurrencias de carácter anterior. Entonces, si escribo m*, buscará archivos mmmmmm .....! Aquí está utilizando * como el único personaje para que el compilador esté buscando el personaje para encontrar múltiples ocurrencias, por lo que arroja la excepción. :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top