2016-07-31 8 views
0

Ich versuche, meine Tokenizer arbeiten durch Aufspalten und behalten Trennzeichen wie Semikolon, Klammer, Punkt und doppelte Anführungszeichen.C++ Regex Ausdruck Token Delimiter

string s ("main() a; i, Keyboard.readInt(HOW MANY NUMBERS?);"); 
regex e ("([.,;-]|[^.,;-]+)"); 
regex_iterator<std::string::iterator> rit (s.begin(), s.end(), e); 
regex_iterator<std::string::iterator> rend; 

while (rit!=rend) { 
    cout << rit->str() << endl; 
    ++rit; 
} 

Wenn ich es kompiliere, ist es ein bisschen kaputt. Ist etwas falsch mit meiner Regex ([.,;-]|[^.,;-]+)? Der Ausgang Ich erhalte sieht wie folgt aus:

main() a 
; 
i 
, 
Keyboard 
. 
readInt(HOW MANY NUMBERS?) 
; 

ich die Ausgabe wie folgt aus der Hoffnung:

main 
(
) 
a 
; 
i 
, 
Keyboard 
. 
readInt 
(
HOW MANY NUMBERS? 
) 
; 

Antwort

0

Ihre größte Problem, wirklich ist, dass Sie nicht Ihre Liste von Split haben Sie Token abgeschlossen. Was Sie wollen, ist etwas wie [.,;-:()\[\]"']|[^.,;-:()\[\]"']+, die besser in der Lage sein sollte, Ihre Zeichenfolge zu zerlegen.

Natürlich ist es nicht die beste Idee, eine Programmiersprache (die eine Art von context-free grammar ist) mit regex (die weniger formale Macht hat) zu parsen. Aber da ich den Kontext hier nicht kenne, gehe ich davon aus, dass du das weißt und dass eine Regex wirklich der beste Weg für dich ist.

+0

danke. Ich habe es herausgefunden. ([((). ;; -] | [^(). ;; -] +) – lowerbound

+0

Wenn eine Antwort hilfreich ist, geben Sie SO als Antwort "+1" oder "beantwortet" an, damit andere wissen, wo schau, wenn in einer ähnlichen Situation. –