2012-01-13 22 views
0

boost :: regexについていくつか質問があります:私は以下の例を試しました。Regexが結果を返さない

1)sregex_token_iteratorの第4パラメタは何ですか?それは "デフォルトマッチ"のように聞こえましたが、何も返さないのではなく、なぜそれを望むでしょうか?私は4番目のパラメータなしでそれを試しましたが、コンパイルされません。

2)私は出力を取得しています: (1、0) (0、0) (3、0) (0、0) (5、0)

誰が何を説明することができますうまくいかない?

#include <iostream> 
#include <sstream> 
#include <vector> 
#include <boost/regex.hpp> 

// This example extracts X and Y from (X , Y), (X,Y), (X, Y), etc. 


struct Point 
{ 
    int X; 
    int Y; 
    Point(int x, int y): X(x), Y(y){} 
}; 

typedef std::vector<Point> Polygon; 

int main() 
{ 
    Polygon poly; 
    std::string s = "Polygon: (1.1,2.2), (3, 4), (5,6)"; 

    std::string floatRegEx = "[0-9]*\\.?[0-9]*"; // zero or more numerical characters as you want, then an optional '.', then zero or more numerical characters. 
    // The \\. is for \. because the first \ is the c++ escpape character and the second \ is the regex escape character 
    //const boost::regex r("(\\d+),(\\d+)"); 
    const boost::regex r("(\\s*" + floatRegEx + "\\s*,\\s*" + floatRegEx + "\\s*)"); 
    // \s is white space. We want this to allow (2,3) as well as (2, 3) or (2 , 3) etc. 

    const boost::sregex_token_iterator end; 
    std::vector<int> v; // This type has nothing to do with the type of objects you will be extracting 
    v.push_back(1); 
    v.push_back(2); 

    for (boost::sregex_token_iterator i(s.begin(), s.end(), r, v); i != end;) 
    { 
    std::stringstream ssX; 
    ssX << (*i).str(); 
    float x; 
    ssX >> x; 
    ++i; 

    std::stringstream ssY; 
    ssY << (*i).str(); 
    float y; 
    ssY >> y; 
    ++i; 

    poly.push_back(Point(x, y)); 
    } 

    for(size_t i = 0; i < poly.size(); ++i) 
    { 
    std::cout << "(" << poly[i].X << ", " << poly[i].Y << ")" << std::endl; 
    } 
    std::cout << std::endl; 

    return 0; 
} 
+0

あなたはlibpcreを試してみましたか? –

+0

私はこれ以上の依存関係を導入したくありません。 –

答えて

0

あなたの正規表現は完全にオプションです:

"[0-9]*\\.?[0-9]*" 

も、空の文字列にマッチします。したがって、"(\\s*" + floatRegEx + "\\s*,\\s*" + floatRegEx + "\\s*)"も1つのカンマに一致します。

あなたは必須少なくとも何か行う必要があります。これは11.11..1なく.ことができます

"(?:[0-9]+(?:\\.[0-9]*)?|\\.[0-9]+)" 

(?:   # Either match... 
[0-9]+  # one or more digits, then 
(?:   # try to match... 
    \.   # a dot 
    [0-9]*  # and optional digits 
)?   # optionally. 
|   # Or match... 
\.[0-9]+ # a dot and one or more digits. 
)   # End of alternation 
+0

ティム、私はそれを考えましたか?ドットをオプションにするだけでしたか?私は1.と同様に.1を許可したかったので、小数点の両側に[0-9] *を使用していました。どのように私はちょうど作るのですか?オプション? また、私は質問をより適切な解析で更新しました。しかし、私は期待していた3の代わりに5つの出力を得ますか? –

+0

OK、私は正規表現を編集しました。まもなく説明が追加されます。 '*'は数字も任意にしました。 –

+0

ティムに感謝します。それは確かにすべてのものをオプションにするよりも優れています。しかし、ハードコーディングされた入力では、私の非堅牢な表現はまだ正しく動作するはずですか?私は元の投稿で#2で表示された出力のために、私はC++で何か間違っていると思いますか? –