2016-04-07 9 views
-1

Ich habe versucht, dies für mehrere Tage zu tun, aber immer noch nicht das richtige Ergebnis.Regex - erhalten mehrere Aufnahmen an mehreren Linien und ihre Positionen

Ich muss alle Captures aus einer ganzen Zeichenfolge (einschließlich Zeilenumbrüche) erhalten, aber nicht nach dem ersten übereinstimmen. Ich habe diese Regex: (\d+)\s*;. Das Ergebnis sollte nur Zahlen sein (nicht die Leerzeichen und Semikolon danach) und es sollte sie von der ganzen Eingabezeichenfolge (die mehrzeilig ist) nehmen.

So zum Beispiel von diesem Eingang:

5; 
6 ; 
7; 
8 ; 

Es sollte "5" zurück "6", "7" und "8".

Wer weiß, wie man das in C++ macht?

Danke!


EDIT:

Von Links in den Kommentaren erwähnt, kam ich mit diesem Code auf:

std::regex regex(regex_str, std::regex_constants::icase); 

for (std::sregex_iterator it = std::sregex_iterator(input.begin(), input.end(), regex); it != std::sregex_iterator(); ++it) 
{ 
    std::smatch m = *it; 

    std::cout << "\t" << m[1].str() << std::endl; 
} 

Es funktioniert ganz gut, aber es gibt eine Sache, die ich vergaß zu erwähnen: I Außerdem müssen Sie die Position jedes Captures erhalten. Mit m.position() kann ich die Position des gesamten Matches ermitteln, aber wenn es etwas vor der gefangenen Gruppe gibt, die ich suche, sagt es mir eine falsche Position. Also, wie kann ich eine Position des Captures bekommen?

+0

Bitte Code zeigen. Ich bin sicher, dass Sie nur mit 'match_object [1] .str()' auf den erfassten Wert zugreifen können. –

+1

Um mehrere Übereinstimmungen zu erhalten, gibt es mehr als 1 Möglichkeit. Siehe [diese Antwort] (http://stackoverflow.com/questions/32765512/what-does-stdmatch-resultsize-return/32765645#32765645) für ein Beispiel, wie es gemacht werden kann. –

Antwort

0

können Sie regex_token_iterator verwenden Ihr Ziel zu erreichen:

#include <regex> 
#include <iostream> 
using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::string strExample = "5\n 6\n\t7 ; 8; 10"; 
    std::regex re("\\d+"); 

    for (std::sregex_token_iterator it(strExample.cbegin(), strExample.cend(), re); it != std::sregex_token_iterator(); ++it) 
    { 
     std::cout << *it << endl; 
    } 

    return 0; 
} 
+0

OP muss nicht alle Zahlen erhalten, sondern nur diejenigen, die mit optionalen Leerzeichen und einem Semikolon gefolgt werden. Warum verwenden Sie auch kein Raw-String-Literal für die Musterdeklaration? –

+0

Warum? Lies seinen Beitrag erneut. Für eine gegebene Eingabe sollte die Zahl 5, 6, 7, 8 zurückgegeben werden. – CodeFuller

+0

Ja, und wenn die Zeichenfolge 56 Bücher enthält, sollte '56' nicht in den Ergebnissen enthalten sein. –

Verwandte Themen