2009-05-27 18 views
37

estoy usando split() a tokenize una cadena separada con * siguiendo este formato:error Tokenización: java.util.regex.PatternSyntaxException, colgando metacarácter '*'

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

estoy leyendo esto desde un archivo llamado "entrada.al" utilizando 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 yo estoy haciendo esta excepción:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 *

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

Respuesta

118

No, el problema es que * es un carácter reservado en expresiones regulares, por lo que debe escaparse.

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

* significa "cero o más de la expresión anterior" (ver el Pattern Javadocs), y que no estaban dando cualquier expresión anterior, haciendo que su expresión dividida ilegal. Es por eso que el error fue PatternSyntaxException.

3

La primera respuesta lo cubre.

Supongo que, en algún momento, puede decidir almacenar su información en una clase/estructura diferente. En ese caso, probablemente no desee que los resultados entren en una matriz del método split().

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

esto 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. 
} 
 

A continuación, la versión del código de análisis que Iniciado sería algo como esto: (Esto les almacena en un LinkedList, usted podría utilizar algo más como una tabla hash, 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(); 
} 
 
2

es porque * se utiliza como un meta para significar una o más ocurrencias del carácter anterior. Entonces, si escribo M *, ¡buscará los archivos MMMMMM .....! Aquí está utilizando * como el único carácter para que el compilador busque el personaje para encontrar múltiples ocurrencias de, por lo que arroja la excepción :) :)

5

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 de su expresión regular.

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