Ich habe eine Funktion in C++, die eine Eingabezeichenfolge einnimmt, die ein Datum des Formats MM/DD/YYYY darstellt. Die Funktion verwendet die C-Implementierung von Regex aufgrund von Einschränkungen meiner Umgebung. Ich versuche, Jahr, Monat und Datum aus der Zeichenfolge zu extrahieren.Erfassen von Gruppen in Regex in C++
#include <stdarg.h>
#include <string.h>
#include <iostream>
#include <regex.h>
#include <sys/types.h>
using namespace std;
void convertDate(string input)
{
char pattern[100];
regex_t preg[1];
regmatch_t match[100];
const char * reg_data = input.c_str();
string year;
string month;
string day;
strcpy(pattern, "^([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})$");
int rc = regcomp(preg, pattern, REG_EXTENDED);
rc=regexec(preg, reg_data, 100, match, 0);
if(rc != REG_NOMATCH)
{
year = input.substr(match[3].rm_so, match[3].rm_eo);
month = input.substr(match[1].rm_so, match[1].rm_eo);
day = input.substr(match[2].rm_so, match[2].rm_eo);
cout << year << endl;
cout << month << endl;
cout << day << endl;
}
}
Hier sind einige Beispiele von Eingabe/Ausgabe:
1) string input2 = "8/11/2014";
convertDate(input2);
2014
8
11/2
2) string input2 = "11/8/2014";
convertDate(input2);
2014
11
8/20
3) string input2 = "1/1/2014";
convertDate(input2);
2014
1
1/2
Ich bin mir nicht sicher, warum der Tag eine Regex Gruppe von Länge aufzeichnet 4, wenn die Capture-Gruppe heißt es, nur die Erfassung werden soll 1 oder 2 Zeichen, die Ziffern sind. Warum sollte der Tag dieses Problem haben, wenn der Monat stimmt? Sie benutzen die gleiche Logik, wie es aussieht.
verwendete ich die Dokumentation here
Welche Compiler und Version verwenden Sie? – NathanOliver
Ich verwende einen Online-Compiler, der C++ 11 verwendet. [Siehe hier] (http://www.tutorialspoint.com/compile_cpp11_online.php) @NathanOliver – Danzo
OK. Das ist gcc 5.3.1. Ich fragte wegen [dieser] (http://stackoverflow.com/questions/12530406/is-gcc-4-8-or-arlier-buggy-about-regular-expressions) – NathanOliver