2016-07-31 53 views
0

我試圖通過分割和保留分號如分號,括號,點和雙引號來讓我的分詞器工作。C++正則表達式令牌分隔符

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

當我編譯它時,它有點破了。我的正則表達式([.,;-]|[^.,;-]+)有什麼問題嗎?輸出我得到這個樣子的:

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

我希望輸出這樣的:

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

回答

0

你的最大的問題,真的,就是你沒有你的分裂名單令牌完成。你想要的是類似於[.,;-:()\[\]"']|[^.,;-:()\[\]"']+,它應該能夠更好地分解你的字符串。

當然,嘗試使用正則表達式(它具有較少的正式權力)解析編程語言(這是一種context-free grammar)並不是最好的主意。但是,由於我不瞭解這裏的背景,我假設你知道這一點,並且正則表達式確實是最適合你的方式。

+0

謝謝。我想到了。 ([()。,; - ] | [^()。,; - ] +) – lowerbound

+0

如果答案有幫助,SO上的習慣是給+1或「回答」,這樣其他人知道在哪裏看看什麼時候出現類似的情況。 –