我們最經常遇到的驗證,就是電子郵件地址驗證。網站上常見。各種網頁腳本也都常用“正則表達式”(regular expression)對我們輸入的電子郵件地址進行驗證,判斷是否合法。有的還能分解出用戶名和域名。現在用C++語言實現一下電子郵件地址驗證程序,用的是C++ 11標准新增加的STL正則表達式。
源代碼如下,該代碼已在Visual Studio 2010上驗證通過。g++ 4.6不支持C++ 11的STL正則表達式,g++ 4.6上編譯可以通過,但運行時錯誤,拋出regex_error異常。因此,如果要在g++ 4.6上使用正則表達式,請用GNU正則表達式庫或者用boost正則表達式庫。
/* * regex.cpp - 用正則表達式驗證電子郵件地址 * * C++11標准 STL正則表達式 * * * Copyright 葉劍飛 2012 * * 編譯命令: * cl regex.cpp /EHsc /link /out:regex.exe * */ #include <iostream> #include <cstdlib> #include <string> #include <regex> // regular expression 正則表達式 using 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})?)"); // 正則表達式,匹配規則: // 第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; }