我們最經常遇到的驗證,就是電子郵件地址驗證。網站上常見。各種網頁指令碼也都常用“Regex”(regular expression)對我們輸入的電子郵件地址進行驗證,判斷是否合法。有的還能分解出使用者名稱和網域名稱。現在用C++語言實現一下電子郵件地址驗證程式,用的是C++ 11標準新增加的STLRegex。
原始碼如下,該代碼已在Visual Studio 2010上驗證通過。g++ 4.6不支援C++ 11的STLRegex,g++ 4.6上編譯可以通過,但執行階段錯誤,拋出regex_error異常。因此,如果要在g++ 4.6上使用Regex,請用GNURegex庫或者用boostRegex庫。
/* * regex.cpp - 用Regex驗證電子郵件地址 * * C++11標準 STLRegex * * * Copyright 葉劍飛 2012 * * 編譯命令: * cl regex.cpp /EHsc /link /out:regex.exe * */#include <iostream>#include <cstdlib>#include <string>#include <regex> // regular expression Regexusing namespace std;int main ( ){ string email_address; string user_name, domain_name; regex pattern("([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)"); // Regex,匹配規則: // 第1組(即使用者名稱),匹配規則:0至9、A至Z、a至z、底線、點、連字號之中 // 的任一字元,重複一遍或以上 // 中間,一個“@”符號 // 第二組(即網域名稱),匹配規則:0至9或a至z之中的任一字元重複一遍或以上, // 接著一個點,接著a至z之中的任一字元重複2至3遍(如com或cn等), // 第二組內部的一組,一個點,接著a至z之中的任一字元重複2遍(如cn或fr等) // 內部一整組重複零次或一次 // 輸入檔案結尾符(Windows用Ctrl+Z,UNIX用Ctrl+D)結束迴圈 while ( cin >> email_address ) { if ( regex_match( email_address, pattern ) ) { cout << "您輸入的電子郵件地址合法" << endl; // 截取第一組 user_name = regex_replace( email_address, pattern, string("$1") ); // 截取第二組 domain_name = regex_replace( email_address, pattern, string("$2") ); cout << "使用者名稱:" << user_name << endl; cout << "網域名稱:" << domain_name << endl; cout << endl; } else { cout << "您輸入的電子郵件地址不合法" << endl << endl; } } return EXIT_SUCCESS;}