c ++ std :: regex, smatch behält Unterausdrücke nur einmal bei, um sie in einer Musterzeichenfolge wiederzugeben.

Ich habe den folgenden Code:

    int main()
    {
        regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*");
        //regex reg_expr("(\\([A-Z],[A-Z]\\))(?:\\s(\\([A-Z],[A-Z]\\)))*\\s(\\([A-Z],[A-Z]\\))");
        smatch sm;
        string input("(A,B) (C,D) (F,W) (G,K) (R,M)");
        //string input("(A,B) (C,D) (F,W)");
        if (regex_match(input, sm, reg_expr)) {
            cout << "true\n";
            cout << sm.size() << "\n";
            for (int i = 0; i < sm.size(); i++) {
                //if (sm[i].length())
                    cout << "submatch number " << i << ": " << sm[i].str() << '\n';
            }
        } else
            cout << "false";
    return 0;
    }

Alles funktioniert einwandfrei, mit der Ausnahme, dass "smatch sm" nur eine Teilzeichenfolge für jeden in der Zeichenfolge für reguläre Ausdrücke angegebenen Unterausdruck enthält. Zum Beispiel für die folgende Testzeichenfolge:

 (A,B) (C,D) (F,W) (G,K) (R,M)

Das ist richtig mit dem @ abgeglich

 (\([A-Z],[A-Z]\))(?:\s(\([A-Z],[A-Z]\)))*

ei einem regulären Ausdruck hat das "sm" nur Baumteilzeichenfolgen: Eine steht für die gesamte Zeichenfolge, und die anderen beiden sind "(A, B)" und "(R, M)", die "(C, D)". "(F, W)", "(G, K)" fehlen, aber sie stimmen überein.

Es sieht aus wie das(?:\s(\([A-Z],[A-Z]\)))* wird von regulären Ausdrücken richtig verstanden, dass 0 oder mehr der Unterausdrücke übereinstimmen sollten, aber es scheint einen Fehler zu geben, dass nur ein Unterausdruck im @ gespeichert isstd::smatch sm.
Ist es ein Bibliotheksfehler (was weniger wahrscheinlich ist) oder mache ich etwas falsch? Ihre Hilfe und Beratung ist willkommen!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage