2016-06-08 24 views
2

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

+0

Welche Compiler und Version verwenden Sie? – NathanOliver

+0

Ich verwende einen Online-Compiler, der C++ 11 verwendet. [Siehe hier] (http://www.tutorialspoint.com/compile_cpp11_online.php) @NathanOliver – Danzo

+0

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

Antwort

2

Sie sind zu Unrecht die .substr method verwenden. Das zweite Argument von substr sollte die Länge der Teilzeichenfolge sein, aber Sie geben den Endindex an. Versuchen Sie dies stattdessen:

day = input.substr(match[2].rm_so, match[2].rm_eo - match[2].rm_so);