2016-07-31 1 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? 
) 
; 

答えて

0

あなたの最大の問題は、本当に、あなたが分割のリストを持っていないということです。私はこのような出力に願っています

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

:私はこのようなルックスを取得しています出力トークンは完了しました。あなたが望むのは[.,;-:()\[\]"']|[^.,;-:()\[\]"']+に似ています。これはあなたのストリングをよりよく解くことができるはずです。

もちろん正規表現(あまり正式な力を持たない)を使ってプログラミング言語(タイプはcontext-free grammar)を解析しようとするのは良い考えではありません。しかし、私はここでのコンテキストを知らないので、私はあなたがこれを知っていると仮定して、正規表現は本当にあなたのための最善の方法です。

+0

ありがとうございました。私はそれを考え出した。 – lowerbound

+0

答えが役に立つのであれば、SOのカスタムは+1または "回答"を与えることで、他の人はどこで知ることができるかを知ることができます。似たような状況で見てください。 –