#include "DatumKezeles.hpp"
#include <regex>
#include <sstream>
using namespace std;
// regex a "YYYY.MM.DD" formátum ellenőrzéséhez
const regex datum_minta(R"(^\d{4}\.\d{2}\.\d{2}$)");
// ^ → illeszkedjen a string elejére (semmi se lehet előtte)
// \d{4} → pontosan négy számjegy (év, pl. 0000–9999)
// \. → literális pont az elválasztáshoz
// \d{2} → pontosan két számjegy (hónap, pl. 01–12)
// \. → literális pont az elválasztáshoz
// \d{2} → pontosan két számjegy (nap, pl. 01–31)
// $ → illeszkedjen a string végére (semmi se követheti)
bool DatumKezeles::ervenyes_datum(const string& s) {
return regex_match(s, datum_minta); // ellenőrzi, hogy a teljes bemeneti string pontosan illeszkedik-e a megadott regex mintára
}
tuple<int, int, int> DatumKezeles::bontott_datum(const string& s) {
int ev = 0, honap = 0, nap = 0;
char pont1, pont2;
istringstream ss(s); // átadjuk egy bemeneti (i...) string‐folyamnak, ss-nek
ss >> ev >> pont1 >> honap >> pont2 >> nap; // >>-nak van beépített „formázott” viselkedése: Először kihagyja az esetleges whitespace karaktereket (szóköz, tab, newline)
return { ev, honap, nap }; // Aztán olvasni kezdi a következő karaktereket, amíg számjegy (0–9) érkezik, és ezekből épít egy int értéket
} // Amikor olyan karakterhez ér – például a pont ('.') –, ami nem illik a szám formátumba, megáll az olvasás.
// A pontot nem „eszi meg” az int-olvasás, hanem ott hagyja a bufferben
// Példa telefonszámokra: +36 20 1234567 vagy +36201234567
static const regex telefon_minta(R"(^\+36\s?20\s?\d{7}$)");
// ^\+36 a “+36” országkód // Csak ebben a .cpp-ben lesz látható a telefon_minta név
// \s? opcionális szóköz // Más .cpp-k nem látják, nem ütközhetnek vele, és nem férnek hozzá
// 20 a körzetszám (pl. mobil: 20) // Minek? #1 Implementáció-elrejtés
// \s? opcionális szóköz #2 Névütközés elkerülés
// \d{7} pontosan 7 számjegy (egyéni hívószám)
// $ a string végét jelzi