• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ a regex (wyrażenia regularne)

VPS Starter Arubacloud
0 głosów
1,494 wizyt
pytanie zadane 17 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
Hej, mam pytanie czy można użyć wyrażeń regularnych w warunkach w c++?

Chodzi mi o walidacje danych, user ma wprowadzić datę w formacie dd.mm.yyyy i chyba łatwiej było by sprawdzić to używając regex'a. A może jest jakaś biblioteka, która ma funkcje walidacji danych ?

Z góry dziękuje za odpowiedź i miłego dzonka Wam życzę ;)

2 odpowiedzi

0 głosów
odpowiedź 17 października 2017 przez m4sk1n Pasjonat (16,750 p.)
http://en.cppreference.com/w/cpp/regex

Tak, C++11 posiada bibliotekę od regexa.
0 głosów
odpowiedź 17 października 2017 przez Bondrusiek Maniak (61,410 p.)

Witaj,

wydaje mi się że do takiego zadania możesz użyć klasy i przeciążyć operator>>. Tutaj prosty przykład klasy Date, którą umożliwia zapisanie formatu dd.mm.yyyy:

#include <iostream>
using namespace std;
class Date {
static int lengths [12];
int day,month,year;
public:
Date ();
Date (int day,int month,int year);
Date &operator++ ();
friend bool operator< (const Date &first,const Date &second);
friend ostream &operator<< (ostream &stream,const Date &date);
friend istream &operator>> (istream &stream,Date &date); };
int Date::lengths [12]={31,28,31,30,31,30,31,31,30,31,30,31};
Date::Date (): day (),month (),year () {}
Date::Date (int day,int month,int year): day (day),month (month),year (year) {}
Date &Date::operator++ () {
lengths [1]=(year%4 ? 28 : 29);
if (++day>lengths [month-1]) {
day=1;
if (++month>12) {
month=1;
++year; }}
return *this; }
bool operator< (const Date &first,const Date &second) {
return first.year<second.year
|| (first.year==second.year && (first.month<second.month
|| (first.month==second.month && first.day<second.day))); }
ostream &operator<< (ostream &stream,const Date &date) {
return stream<<date.day<<'.'<<date.month<<'.'<<date.year; }
istream &operator>> (istream &stream,Date &date) {
char character;
stream>>date.day>>character>>date.month>>character>>date.year; }
int main () {
Date first,second;
cin>>first>>second;
for (int i=0;i<7;++i)
cout<<++(first<second ? second : first)<<endl;
return 0; }

Możesz później jeszcze użyć instrukcji if() do sprawdzenia czy wartości liczbowe są poprawne.

Pozdrawiam

komentarz 17 października 2017 przez m4sk1n Pasjonat (16,750 p.)
Czasem prościej jest użyć regexa, zależy w jakim celu potrzebuje tego op
komentarz 17 października 2017 przez Bondrusiek Maniak (61,410 p.)
Zgoda podałem tylko alternatywną możliwość. Bez kombinacji być może to się mu nie przyda tylko będzie używał wyrażeń regularnych.
komentarz 18 października 2017 przez Shiro Stary wyjadacz (10,300 p.)
Fajne, a jak zrobić to wyrażeniem regularnym ;D ?

Dziękuje Ci i pozdrawiam ;)

Podobne pytania

0 głosów
1 odpowiedź 825 wizyt
pytanie zadane 19 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
2 odpowiedzi 820 wizyt
0 głosów
0 odpowiedzi 133 wizyt

92,768 zapytań

141,690 odpowiedzi

320,506 komentarzy

62,106 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...