• 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)

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,631 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,440 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,440 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ź 937 wizyt
pytanie zadane 19 października 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
2 odpowiedzi 1,057 wizyt
0 głosów
0 odpowiedzi 176 wizyt

93,281 zapytań

142,285 odpowiedzi

322,304 komentarzy

62,604 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...