如何使用sregex_token_iterator

时间:2013-11-03 02:26:28

标签: c++ regex c++11

我正在尝试使用正则表达式解析SQL语句,同时对“sregex_token_iterator”的行为感到困惑。

我的函数f()和g()看起来相似,而前者打印两个句子而后者,g()只打印一个: enter image description here

这是f():

void f()
{
    cout << "in f()" << endl;
    string str = " where a <= 2 and b = 2";
    smatch result;
    regex pattern("(\\w+\\s*(<|=|>|<>|<=|>=)\\s*\\w+)"); 
    const sregex_token_iterator end;
    for (sregex_token_iterator it(str.begin(), str.end(), pattern); it != end; it ++)
    {
        cout << *it << endl;
    }
}

这是g():

void g()
{
    cout << "in g()" << endl;
    string str = " where a <= 2 and b = 2";
    smatch result;
    regex pattern("(\\w+\\s*(<|=|>|<>|<=|>=)\\s*\\w+)"); 
    const sregex_token_iterator end;
    for (sregex_token_iterator it(str.begin(), str.end(), pattern); it != end; it ++)
    {
        cout << *it << endl;
        string cur = *it;

        pattern = "(\\w+)\\s*<>\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) )
        {
//          cout <<"<>" << endl;
        }

        pattern = "(\\w+)\\s*=\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) ){}

        pattern = "(\\w+)\\s*<\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) ){}

        pattern = "(\\w+)\\s*>\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) ){}

        pattern = "(\\w+)\\s*<=\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) ){}

        pattern = "(\\w+)\\s*>=\\s*(\\w+)";
        if ( regex_match(cur, result, pattern) ){}
    }
}

我猜测变量'end'(“const sregex_token_iterator end;”)在g()中发生了变化,或者“for”子句中的判断条件在++之后失败了。

如果确实如此,那是怎么发生的。 我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

sregex_token_iterator存储指向pattern的指针,而不是副本。您正在从迭代器下面更改正则表达式。