Tokenisierungsfehler:java.util.regex.PatternSyntaxException, hängendes Metazeichen „*“

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

  •  06-09-2019
  •  | 
  •  

Frage

ich benutze split() um einen durch getrennten String zu tokenisieren * folgendem Format folgen:

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

Ich lese dies aus einer Datei namens „entrada.al“ mit diesem Code:

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();
    }

Und ich bekomme diese Ausnahme:

Ausnahme im Thread „main“ java.util.regex.PatternSyntaxException:Baumelnder Meta -Charakter ' *' in der Nähe von Index 0 * *

Ich vermute, dass das Fehlen eines * Dies ist auf die Alterung der Originaltextdatei zurückzuführen.Wie kann ich das umgehen?

War es hilfreich?

Lösung

Nein, das Problem ist das * ist ein reservierter Charakter in Regexes, also müssen Sie ihm entkommen.

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

* bedeutet "Null oder mehr des vorherigen Ausdrucks" (siehe die Pattern Javadocs), und Sie gaben ihm keinen vorherigen Ausdruck, was Ihren geteilten Ausdruck illegal machte. Deshalb war der Fehler a PatternSyntaxException.

Andere Tipps

Ich hatte ein ähnliches Problem mit regex = "?". Es passiert für alle Sonderzeichen, die in einer Regex eine Bedeutung haben. Sie müssen also haben "\\" als Präfix für Ihre Regex.

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

Die erste Antwort deckt es ab.

Ich vermute, dass Sie sich irgendwann entscheiden werden, Ihre Informationen in einer anderen Klasse/Struktur zu speichern.In diesem Fall möchten Sie wahrscheinlich nicht, dass die Ergebnisse von der Methode split() in ein Array gelangen.

Du hast nicht danach gefragt, aber mir ist langweilig. Deshalb hier ein Beispiel, ich hoffe, es ist hilfreich.

Dies könnte die Klasse sein, die Sie schreiben, um eine einzelne Person darzustellen:


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

Dann würde die Version des Parsing-Codes, den Sie ursprünglich gepostet haben, etwa so aussehen:(Dadurch werden sie in einer LinkedList gespeichert. Sie können auch etwas anderes wie eine Hashtable usw. verwenden.)


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 liegt daran, dass * als Metacharakter verwendet wird, um ein oder mehrere Vorschläge des vorherigen Charakters zu bezeichnen. Wenn ich also M* schreibe, wird nach Dateien mmmmmm .....! Hier verwenden Sie * als einziger Charakter, sodass der Compiler nach dem Charakter sucht, um mehrere Ereignisse zu finden, damit er die Ausnahme ausgelegt hat. :) :) :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top