/ / Regex з зворотною референцією не збігається в C ++ - c ++, regex

Regex з зворотним посиланням не буде збігатися в C ++ -c + +, регулярному виразу

Я намагаюся відповідати 4 рівним символам на C ++.

Вони повинні відповідати = 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})" і будь-яка інша їх комбінація.

Я спробував співставити інші візерунки з іншими рядками, і більшість з них працює. Здається, проблема полягає в зворотному відношенні, але я "шукав всюди і не можу знайти, чому це не відповідає.

Я використовую clang ++ 7.0.2 на OS X 10.11.3 з прапорцями -std = c ++ 11 -stdlib = libc ++.

Я також спробував g ++ 5.3.0 з -std = c ++ 11 -std = gnu ++ 11 прапорами.

Відповіді:

2 для відповіді № 1

У вас є дві проблеми:

  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