regex_match给出意想不到的结果

regex_match giving unexpected results

本文关键字:意想不到 结果 match regex      更新时间:2023-10-16

我正在尝试编写一个递归下降解析器,并试图在用户输入的字符串中搜索匹配的正则表达式。我正在尝试执行以下操作以尝试了解 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:

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

谢谢埃里普

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

#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()返回假。
  2. 正则表达式中没有任何捕获组。因此,即使regex_match()返回为真,它也不会捕获任何内容。
  3. regex_match中的捕获次数可以通过查看正则表达式严格确定。所以我的re将只捕获一组
  4. 但是我们希望在字符串上多次应用此正则表达式,因为我们想找到所有匹配项。该工具是 regex_iterator .
  5. 我们还需要转义正则表达式中的-。减号在字符类中具有特殊含义。

我找到了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
}