2016-04-17 2 views
0

Also die Eingabe sieht so aus {q1, q2}, {a, b}, {[q1: a: q2], [q2: b: q2]}, q1, {q2} Ein DFA ziemlich.Wie wird eine Zeichenkette geteilt, während die verschiedenen Begrenzer gezählt werden?

Was ich tun möchte, ist es durch Komma, Klammern und Doppelpunkt zu teilen. dann drucken Sie die Ergebnisse einzeln aus (dh alles in den geschweiften Klammern hat eine eigene Methode).

Beispiel:

Part1 = q1 q2

Part2 = ab

Part3 = q1 bis q2 mit einem q2

geht mit B q2 geht

Part4 = q1

Part5 = q2

Was ich dachte, wurde eine Anzahl von geschweiften Klammern und wenn die Anzahl der geschweiften Klammern halten = 1,3,5, etc ... werden sie ausführen diese Methoden entsprechend.

Problem ist, wenn ich es als eine Zeichenfolge verwenden, ich habe keine Möglichkeit, sicherzustellen, es „q1“ als eine Zeichenfolge statt „q“ und „1“

prüfen wird Wenn ich die Zeichenfolge unter Verwendung von .split (\ s *, \ s * | \ {| \} | \ [| \]) aufspalte, werden diese Zeichen entfernt und ich kann sie nicht mehr zählen.

Oder sollte ich nur die geschweiften Klammern, drucken Sie eine Teilzeichenfolge (die geschweifte Klammer abziehen), sobald es eine enge geschweifte Klammer sieht, wird es mit der nächsten Methode verschieben.

Was ich habe versucht:

Splitting der String und Speicherung in einer Liste

List<String> listDFA = Arrays.asList(DFA.split("\\s*,\\s*|\\{|\\}|\\[|\\]")); 

DFA Start

for (index = 0; index<size; index++){ 
    if (curlyBrackets.contains(listDFA.get(index))){ //curlyBrackets has "{}" 
     System.out.println("curly"); // just a test if it sees a curly will omit later 
    } 

    System.out.println(index); // again a test wanted to see what was being indexed 
    System.out.println(listDFA.get(index)); 
    } 

Was ich versuchen wollte:

for (index = 0; index <size; index++){ 
    if (curlyBrackets.contains(DFA.substring(index, index+1))){ 
     curly++; 
     if (curly == 1){ 
      index++; 
      states(DFA); 
     } 
    } 
} 

Und states() ist:

+1

regex analysiert nicht, es passt. Sie brauchen einen Parser. – Bohemian

+0

@ChristianJonassen hat den Beitrag aktualisiert, danke! – Nate

+0

Die Zeichenfolge, die Sie scannen, erfordert ein kontextfreies Grammatik-Werkzeug, kein reguläres Ausdruckswerkzeug (DFA). Sie benötigen einen Parser (DPDA: deterministischer Pushdown-Automat). – EJP

Antwort

0

Ich denke, irgendeine Art von Hot-Fix für das Problem, aber ich spalte immer noch die Zeichenfolge mit Komma als Trennzeichen (anstelle der Klammern).

List<String> listDFA = Arrays.asList(DFA.split("\\s*,\\s*")); 

Deshalb wird jeder Inhalt der Zeichenfolge zu machen mit einem Index zugeordnet sein (Klammern werden auf die nächste nicht-Komma beigefügt). Speichern Sie diesen Index dann in einer Zeichenfolge.siehe

String currString = listDFA.get(index); 

Dann, wenn ein Teil dieser Zeichenfolge hat eine geschweifte Klammer

if (currString.indexOf('{') != -1 || currString.indexOf('}') != -1) 

Und sobald es die geschweifte Klammer Zustand übereinstimmt, führen Sie diesen Block

if (curly <= 2){ 
      Q.add(currString); 
    } 

Jetzt alles, was ich zu herauszufinden, wie man das mit eckigen Klammern macht, da ich diese in einem 2D Array speichern muss

Verwandte Themen