Mit this regex möchte ich Zeit mit oder ohne ein Millisekunden (ms) Feld übereinstimmen. Der Vollständigkeit halber schreibe ich die Regex hier (ich die Anker in regex101 entfernt mehrzeiligen zu aktivieren):C++ 11: Sicheres Üben mit Regex von zwei möglichen Übereinstimmungen
^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$
ich irgendwie nicht das C++ Verhalten verstehen. Jetzt sehen Sie in Regex101, die Anzahl der Capture-Gruppen hängt von der Zeichenfolge ab. Wenn es keine ms gibt, ist es 3 + 1 (da C++ die Übereinstimmung [0] für das übereinstimmende Muster verwendet), und wenn es ms gibt, dann ist es 4 + 1. Aber dann in diesem Beispiel:
std::regex timeRegex = std::regex(R"(^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$)");
std::smatch m;
std::string strT = std::string("12:00:09");
bool timeMatch = std::regex_match(strT, m, timeRegex);
std::cout<<m.size()<<std::endl;
if(timeMatch)
{
std::cout<<m[0]<<std::endl;
std::cout<<m[1]<<std::endl;
std::cout<<m[2]<<std::endl;
std::cout<<m[3]<<std::endl;
std::cout<<m[4]<<std::endl;
}
Wir sehen, dass m.size()
ist immer 5, ob es oder nicht ms Feld! m[4]
ist eine leere Zeichenfolge, wenn kein MS-Feld vorhanden ist. Ist dieses Verhalten der Standard in Regex von C++? Oder sollte ich versuchen (oder irgendeine andere Sicherheitsmaßnahme), wenn Zweifel an der Größe sind? Ich meine ... selbst die Größe ist hier ein wenig irreführend!
Sind Sie fragen, warum gibt es fünf Gruppen alles in allem? Weil Sie eine ganze Übereinstimmung + 4 Erfassungsgruppen im Muster definiert haben. Ob die Gruppe übereinstimmt oder nicht, ist gemäß ECMAScript scpes nicht wichtig, leere Gruppen werden immer mit einer leeren Zeichenfolge vorbelegt. –
@ WiktorStribiżew Bitte überprüfen Sie den regex101 Link, den ich zur Verfügung gestellt habe. Falls es kein ms-Feld gibt, sollte es nur 3 + 1, nicht 4 + 1 sein. –
Es ist mir egal, und Sie und alle Benutzer sollten sich nicht darum kümmern, was regex101 zeigt oder nicht, es hat seine eigenen Bugs. Was wichtig ist, ist das, was Sie im Code haben. Du hast 4 Capturing Groups definiert - es gibt 4 Slots für jede + 1 für das ganze Match bei Index 0. –