在C++中使用反向引用的正则表达式无法匹配

3

我正在尝试在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})"和这些的每种组合。

我尝试将其他模式与其他字符串匹配,大多数都有效。似乎问题在于反向引用,但我已经到处查找,找不到为什么它无法匹配的原因。

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

我还尝试了带有-std=c++11 -std=gnu++11标志的g++ 5.3.0。


你应该从转义字符“\”开始。你可能是指 "(.)\\1{3}" - Cornstalks
这将匹配“\”,我试图做的是将前面捕获组的匹配重复{3}次,以便它可以匹配4次相同的字符。 - Jordi Loyzaga
不,它不会匹配 ""(那将是 "\\",这是正则表达式 \\)。您需要在字符串文字中转义反斜杠。正则表达式 (.)\1{3} 是正确的,但为了在字符串文字中编写它,您需要转义 \,因此它是 "(.)\\1{3}" - Cornstalks
我尝试了 "(.)\\1{3}" 但它无法匹配。 - Jordi Loyzaga
1个回答

2
You've got two problems:
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

做到了,非常感谢!我已经为此苦苦挣扎了几个小时。 - Jordi Loyzaga
1
很高兴能够帮到您!感谢您发布了一篇措辞清晰、代码明确的问题,我(以及其他人)都可以阅读和使用;看到新用户发布了一个很棒的第一个问题真是太好了。 - Cornstalks
在这种情况下,“你有两个问题”很有趣,因为它是真实的。 - fish2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接