2017-11-17 2 views
1

Also, während ich einen Brainfuck-Übersetzer in Java schreibe, muss ich den String folgenden Regeln folgen: Jedem der [ ] , . Zeichen oder einer beliebigen Folge des + - < > sollte newline folgen. Hier ist die Eingabezeichenfolge:Regex funktioniert nicht immer mit spitzen Klammern

..-<[-]>..[[<<[+[-<-->>+,>-.++]-,>,<[.],][<.,<-]+[-,<->,-]<<[>->-.<-[.<++,>++,].-]]] 

Und mein Code:

s = s.replaceAll("(\\+|-|<|>)+", "$0\n") 
.replaceAll("\\.|\\,|\\[|\\]", "$0\n"); 

Und das Ergebnis (wird SO nicht zulassen, dass dies hier): https://pastebin.com/ZaT8d5ve Was zu erwarten war: https://pastebin.com/gNxcgTSP Es scheint, dass Verbindungen von Klammern mit Plus-Minus-Zeichen sind fehlerhaft, während spitze Klammern mit eckigen Klammern und Punkt/Komma in Ordnung sind. Ich kann nicht wirklich verstehen, was ist los mit meiner Lösung?

Antwort

3

Ihr Ausgang ist genau das, was Sie beschrieben, Sequenz des +-<> von \n gefolgt wird, so wird -<-<\n nicht -\n<\n.

Wenn ich Sie richtig verstehe, wollen Sie der Folge von gleichen Zeichen aufgeteilt, die entweder +-<>\n, nachdem es zu haben. Wenn das der Fall ist, dann statt

s.replaceAll("(\\+|-|<|>)+", "$0\n") 

können Sie verwenden

s.replaceAll("(\\+|-|<|>)\\1*", "$0\n") 

\1 Rückreferenzierung ist aus der Gruppe 1 (hier (\\+|-|<|>)) passen, so dass es einer dieser Charaktere und seine optionalen folgenden Wiederholungen Spiele .

2

Sie scheinen zu glauben, dass

(\\+|-|<|>)+ 

nur Sequenzen von identischen Zeichen wie ++ entsprechen würde, während es auch eine beliebige Reihenfolge dieser Zeichen wie -<-->> übereinstimmt.

Sie brauchen auch nicht zwei Regexe in der Reihenfolge. Folgendes sollte tun:

s = s.replaceAll("([+<>-])\\1*|[,.\\[\\]]", "$0\n"); 
Verwandte Themen