c++ - 如何使用 sregex_token_iterator

标签 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) ){}
    }
}

我猜 g() 中的变量 'end'("const sregex_token_iterator end;") 改变了,或者 "for"子句中的判断条件在它之后失败了++。

如果是这样,那是如何发生的。 我应该怎么做才能解决这个问题?

最佳答案

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

关于c++ - 如何使用 sregex_token_iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749218/

相关文章:

c++ - 在指针列表上使用迭代器

java - 什么是 C++ 11 原子库等同于 Java 的 AtomicMarkableReference<T>

c++ - 使用函数集 c++

c++ - 为什么从静态方法访问非静态方法是糟糕的设计

c++ - 了解编译器的工作原理

c++ - 随机生成的响应? C++

JavaScript 正则表达式差异

javascript - 有没有比一系列正则表达式搜索/替换更好的方法将 HTML 转换为 JavaScript 中的纯文本

java - java Dash 版本中 unicode 的正则表达式

c++ - 使用 unique_ptr move 语义