1: //data_validation.cpp (based on a Deitel example) 2: //Validating user input with regular expressions. 4: #include <iostream> 5: #include <string> 6: using namespace std; 8: #include "boost/regex.hpp" 9: using boost::regex; 10: using boost::regex_match; 12: //Validate the data format using a regular expression 13: bool isValid 14: ( 15: const string& data, //in 16: const string& expression //in 17: ); 19: //Collect input from the user 20: string inputData 21: ( 22: const string& fieldName, //in 23: const string& expression //in 24: ); 26: int main() 27: { 28: cout << endl; 30: //Enter last name 31: string lastName = inputData("last name", "[A-Z][a-zA-Z]*"); 33: //Enter first name 34: string firstName = inputData("first name", "[A-Z][a-zA-Z]*"); 36: //Enter address 37: string address = inputData("address", 38: "[0-9]+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)"); 40: //Enter city 41: string city = 42: inputData("city", "([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)"); 44: //Enter state 45: string province = inputData("province", 46: "([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)"); 48: //Enter postal code 49: string postalCode = inputData("postal code", 50: "[A-Z]\\d[A-Z] \\d[A-Z]\\d"); 52: //Enter phone number 53: string phoneNumber = inputData("phone number (xxx-xxx-xxxx)", 54: "[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}"); 56: //Display the validated data 57: cout << "\nValidated Data\n" 58: << "\nLast name ...... " << lastName 59: << "\nFirst name ..... " << firstName 60: << "\nAddress ........ " << address 61: << "\nCity ........... " << city 62: << "\nState .......... " << province 63: << "\nPostal code .... " << postalCode 64: << "\nPhone number ... " << phoneNumber << endl; 65: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 66: } 68: bool isValid 69: ( 70: const string& data, //in 71: const string& expression //in 72: ) 73: { 74: //Create a regex to validate the data 75: regex validationExpression = regex(expression); 76: return regex_match(data, validationExpression); 77: } 79: string inputData 80: ( 81: const string& fieldName, //in 82: const string& expression //in 83: ) 84: { 85: string data; //For storing data entered by the user 87: //Request the data from the user 88: cout << "Enter " << fieldName << ": "; 89: getline(cin, data); 91: //Validate the data and ask again if invalid 92: while (!isValid(data, expression)) 93: { 94: cout << "Invalid " << fieldName << ".\n"; 95: cout << "Enter " << fieldName << ": "; 96: getline(cin, data); 97: } 98: return data; 99: }