2016-12-12 2 views
3

J'ai une chaîne 'CCCC' et je veux y associer 'CCC', avec chevauchement.Exgex C++ pour les correspondances chevauchantes

Mon code:

... 
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++; 
} 
... 

Cependant, cela ne

retours
CCC 0 

et saute la solution CCC 1, ce qui est nécessaire pour moi.

Je lis à propos de '?' Non gourmand correspondant, mais je ne pouvais pas le faire fonctionner

Répondre

5

Votre regex peut être mis dans les parenthèses de capture qui peuvent être enveloppés avec un lookahead positif.

Pour le faire fonctionner sur Mac, aussi, assurez-vous que les matchs regex (et donc consume) un omble chevalier à chaque match en plaçant un . (ou - pour briser la ligne correspondent aussi à caractères - [\s\S]) après l'apparence.

Ensuite, vous devrez modifier le code pour obtenir la première valeur de groupe de capture comme ceci:

#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; 
} 

Voir la C++ demo

Sortie:

CCC  0 
CCC  1 
+0

Merci, il a résolu le problème . Je marquerai ceci comme résolu dès que je peux. –

+0

il en résulte une boucle infinie sur Apple Clang. –

+0

@RichardHodges: Il doit être lié à [this] (http://stackoverflow.com/questions/33795759/c-mac-os-x-regex-causes-infinite-loop-with-regex-replace/33799633#33799633): la réalisation Mac ne gère pas efficacement les matchs vides. Un '.' ajouté après le lookahead pourrait résoudre le problème: [' std :: regex re ("(? = (CCC))."); '] (Https://ideone.com/pEziQp). Si les caractères de saut de ligne doivent correspondre, le '.' devrait être remplacé par' [\ s \ S] '. –