2016-03-07 57 views
3

我想在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})"和這些所有其他合併審理。

我試過將其他模式與其他字符串進行匹配,其中大部分工作。看來問題在於反向引用,但是我到處尋找,我找不到爲什麼它不匹配。

我在OS X 10.11.3上使用了clang ++ 7.0.2,-std = C++ 11 -stdlib = libC++標誌。

我也試過g ++ 5.3.0和-std = C++ 11 -std = gnu ++ 11個標誌。

+0

你應該逃避''\''字符開頭。你可能是指「(。)\\ 1 {3}」'。 – Cornstalks

+0

這將匹配「\」,我試圖做的是匹配先前的捕獲組{3}次,它將匹配4次相同的字符。 –

+0

不,它不會匹配'「\」'(也就是'「\\\\」',這是正則表達式的'\\'')。 [您需要在字符串文字中轉義反斜槓](http://en.cppreference.com/w/cpp/language/escape)。正則表達式'(。)\ 1 {3}'是正確的,但爲了將其寫入字符串文本中,您需要轉義'''',因此它是'「(。)\\ 1 {3}」' 。 – Cornstalks

回答

2

你有兩個問題:

  1. 你需要escape \。正則表達式(.)\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"; 
} 

outputs:

match = 0 
search = 1 
+0

這樣做,非常感謝你!,我一直在努力掙扎幾個小時。 –

+0

很高興有幫助!感謝您發佈一個措辭良好的問題,並提供我(和其他人)可以閱讀和使用的明確代碼;很高興看到新用戶發佈了一個很好的第一個問題。 – Cornstalks

+0

在這種情況下,「你有兩個問題」很有趣,因爲它是真的。 – fish2000

相關問題