Wie bekomme ich alle möglichen Übereinstimmungen von std :: regex?

8

Ich würde gerne alle möglichen Übereinstimmungen von Regex finden, wie ist es möglich?

%Vor%

Gibt die Ausgabe aus:

%Vor%

Aber kann nicht das dritte 2: 2 genau finden. Ich bevorzuge Regex wegen O(n) Komplexität für die Suche nach mehreren Token gleichzeitig.

UPDATE:

Vielleicht die Token-Liste in nicht-präfixierbare Listen aufteilen und mehrere Regexes erstellen? Zum Beispiel: (2|4|25|45|251|455|267) = & gt; (2|4) , (25|45|267) , (251|455) Dies erhöht die Komplexität auf etwas wie O(n log(m))

UPDATE 2:

Bitte geben Sie einen kurzen STL-basierten Algorithmus zum Aufteilen des Token-Vektors auf nicht vorstellbare Vektoren an, um diese Frage zu beantworten.

    
k06a 15.10.2015, 07:31
quelle

2 Antworten

2

Ich denke nicht, dass es mit einem Iterator und einem einzelnen Regexp möglich ist. So funktioniert das.

Ihr regexp sucht nach einem Teilstring, der entweder "2" oder "25" ist. Jetzt starten Sie die Suche mit sregex_iterator . Es beginnt mit dem ersten Symbol der Zeichenfolge und versucht, Übereinstimmung mit Ihrem regulären Ausdruck zu finden. Wenn es eine Übereinstimmung gibt, wird sie "aufgezeichnet" und der Iterator wird auf die Position nach der Übereinstimmung vorgeschoben. Wenn keine Übereinstimmung vorhanden ist, wird der Iterator um 1 Position nach vorne verschoben. Dieser Prozess wird fortgesetzt, bis das Ende der Zeichenfolge erreicht ist.

Nun wird jedes Mal, wenn es eine Übereinstimmung findet, versucht, die beste (d. h. längste) Übereinstimmung mit Ihrem regulären Ausdruck zu finden. Wenn also ein Teilstring sowohl mit 2 als auch mit 25 übereinstimmt, wird 25 benötigt, da er länger ist. Ich würde sagen, du brauchst 2 reguläre Ausdrücke.

    
SingerOfTheFall 15.10.2015 07:48
quelle
1

Sie können die dritte "2" nicht erhalten, da Regex immer die längste Übereinstimmung zurückgibt. Um "alle möglichen Übereinstimmungen" zu erhalten, müssen Sie die Abfrage zweimal ausführen, da 2 in 25 enthalten ist.

    
deight 15.10.2015 08:02
quelle

Tags und Links