2016-12-12 72 views
3

我有一個字符串'CCCC',我想匹配'CCC',它有重疊。重疊匹配的C++正則表達式

我的代碼:

... 
std::string input_seq = "CCCC"; 
std::regex re("CCC"); 
std::sregex_iterator next(input_seq.begin(), input_seq.end(), re); 
std::sregex_iterator end; 
while (next != end) { 
    std::smatch match = *next; 
    std::cout << match.str() << "\t" << "\t" << match.position() << "\t" << "\n"; 
    next++; 
} 
... 

然而,這只是回報

CCC 0 

,並跳過CCC 1的解決方案,這是需要我。

我讀了關於非貪心'?'匹配,但我不能讓它工作

回答

5

您的正則表達式可以放入捕獲圓括號,可以包裝一個積極的lookahead。

爲了使它在Mac工作,也確保正則表達式匹配(從而消耗)在每次比賽一單個字符被放置.後(或 - [\s\S] - 爲了匹配換行字符)向前看。

然後,你將需要修改代碼來獲得這樣的第一個捕獲組值:

#include <iostream> 
#include <regex> 
#include <string> 
using namespace std; 

int main() { 
    std::string input_seq = "CCCC"; 
    std::regex re("(?=(CCC))."); // <-- PATTERN MODIFICATION 
    std::sregex_iterator next(input_seq.begin(), input_seq.end(), re); 
    std::sregex_iterator end; 
    while (next != end) { 
     std::smatch match = *next; 
     std::cout << match.str(1) << "\t" << "\t" << match.position() << "\t" << "\n"; // <-- SEE HERE 
     next++; 
    } 
    return 0; 
} 

C++ demo

輸出:

CCC  0 
CCC  1 
+0

謝謝,它解決了這個問題。我會盡快解決這個問題。 –

+0

這會導致蘋果叮噹聲無限循環。 –

+0

@RichardHodges:它必須與[this]相關(http://stackoverflow.com/questions/33795759/c-mac-os-x-regex-causes-infinite-loop-with-regex-replace/33799633#33799633 ):Mac實現不能有效地處理空的匹配。在向前看後添加'.'可能會解決問題:['std :: regex re(「(?=(CCC))。」);'](https://ideone.com/pEziQp)。如果換行符必須匹配,則應將'.'替換爲'[\ s \ S]'。 –