带有反向引用的正则表达式在C++中不匹配

Regex with backreference won't match in C++

本文关键字:C++ 不匹配 正则表达式 引用      更新时间:2023-10-16

我正在尝试在C++中匹配 4 个相等的字符。

这些应该匹配 = KQQQQ, ZZZZQ

这是我到目前为止尝试过的:

std::string mano_to_reg = "KQQQQ";
std::regex pokar("(.)1{3}");
std::smatch match;
std::cout << "match = " << std::regex_match(mano_to_reg, match, pokar) << "n";

但它不会匹配。

我也试过std::regex_search,但它也不会匹配。

我尝试使用基本语法和扩展语法

我也尝试将我的模式更改为"(.)1{4}""((.)1{3})" 以及这些的所有其他组合。

我尝试将其他模式与其他字符串匹配,其中大多数都可以工作。似乎问题是反向引用,但我到处寻找,找不到为什么它不匹配。

我在OS X 10.11.3上使用clang++ 7.0.2,带有-std=c++11 -stdlib=libc++标志。

我也尝试过使用 -std=c++11 -std=gnu++11 标志的 g++ 5.3.0。

你有两个问题:

  1. 你需要逃离.正则表达式(.)1{3}是正确的,但是为了将其存储在字符串文本中,您需要对其进行转义,以便对其进行"(.)\1{3}"
  2. 您可能想要std::regex_search而不是std::regex_match。字符串"KQQQQ"与正则表达式(.)1{3}不匹配,但子字符串"QQQQ"匹配。

以下程序:

#include <iostream>
#include <regex>
#include <string>
int main() {
    std::string mano_to_reg = "KQQQQ";
    std::regex pokar("(.)\1{3}");
    std::smatch match;
    std::cout << "match  = " << std::regex_match(mano_to_reg, match, pokar) << "n";
    std::cout << "search = " << std::regex_search(mano_to_reg, match, pokar) << "n";
}

输出:

match  = 0
search = 1