regex_match给出意想不到的结果

时间:2015-03-15 02:15:41

标签: c++ regex c++11

我正在尝试编写一个递归下降解析器,并尝试在匹配器中搜索用户输入的字符串中的正则表达式。我正在尝试执行以下操作以尝试理解C ++ 11提供的<regex>库,但我得到了意想不到的结果。

std::string expression = "2+2+2";
std::regex re("[-+*/()]");  
std::smatch m;

std::cout << "My expression is " << expression << std::endl;

if(std::regex_search(expression, re)) {
    std::cout << "Found a match!" << std::endl;
}

std::regex_match(expression, m, re);

std::cout << "matches:" << std::endl;
for (auto it = m.begin(); it!=m.end(); ++it) {
    std::cout << *it << std::endl;
}

所以根据我的正则表达式,我希望它输出

Found a match!
matches:
+
+

然而,我得到的输出是:

My expression is 2+2+2
Found a match!
matches:

我觉得我犯了一个愚蠢的错误,但我似乎无法弄清楚为什么输出之间存在差异。

谢谢, erip

2 个答案:

答案 0 :(得分:2)

你有一些问题。首先,让我们看一些工作代码:

#include <regex>
#include <iostream>

int main() {
    std::string expr = "2+2+2";
    std::regex re("[+\\-*/()]");

    const auto operators_begin = std::sregex_iterator(expr.begin(), expr.end(), re);
    const auto operators_end = std::sregex_iterator();

    std::cout << "Count: " << std::distance(operators_begin, operators_end) << "\n";

    for (auto i = operators_begin; i != operators_end; ++i) {
        std::smatch match = *i;
        std::cout << match.str() << "\n";
    }
}

输出:

Count: 2
+
+

您的代码问题:

  1. regex_match()返回false。
  2. 正则表达式中没有任何捕获组。因此即使regex_match()返回true,它也不会捕获任何内容。
  3. regex_match中的捕获次数可以通过查看正则表达式来严格确定。因此,我将完全捕获一个组。
  4. 但是我们想多次在字符串上应用这个正则表达式,因为我们想找到所有匹配项。该工具是regex_iterator
  5. 我们还需要转义正则表达式中的-。减号在字符类中具有特殊含义。

答案 1 :(得分:0)

我找到了regex_iterator,解决了这个问题。这是工作代码:

std::regex re("[-+*/()]");  
std::smatch m;

std::cout << "My expression is " << expression << std::endl;

if(std::regex_search(expression, re)) {
    std::cout << "Found a match!" << std::endl;
}

try {
    std::sregex_iterator next(expression.begin(), expression.end(), re);
    std::sregex_iterator end;
    while (next != end) {
        std::smatch match = *next;
        std::cout << match.str() << "\n";
        next++;
    } 
} catch (std::regex_error& e) {
    // Syntax error in the regular expression
}