123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE mfc_example.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: examples of using Boost.Regex with MFC and ATL string types.
- */
- #ifdef TEST_MFC
- #include <boost/regex/mfc.hpp>
- #include <cstringt.h>
- #include <atlstr.h>
- #include <assert.h>
- #include <tchar.h>
- #include <iostream>
- #ifdef _UNICODE
- #define cout wcout
- #endif
- //
- // Find out if *password* meets our password requirements,
- // as defined by the regular expression *requirements*.
- //
- bool is_valid_password(const CString& password, const CString& requirements)
- {
- return boost::regex_match(password, boost::make_regex(requirements));
- }
- //
- // Extract filename part of a path from a CString and return the result
- // as another CString:
- //
- CString get_filename(const CString& path)
- {
- boost::tregex r(__T("(?:\\A|.*\\\\)([^\\\\]+)"));
- boost::tmatch what;
- if(boost::regex_match(path, what, r))
- {
- // extract $1 as a CString:
- return CString(what[1].first, what.length(1));
- }
- else
- {
- throw std::runtime_error("Invalid pathname");
- }
- }
- CString extract_postcode(const CString& address)
- {
- // searches throw address for a UK postcode and returns the result,
- // the expression used is by Phil A. on www.regxlib.com:
- boost::tregex r(__T("^(([A-Z]{1,2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z]))\\s?([0-9][A-Z]{2})$"));
- boost::tmatch what;
- if(boost::regex_search(address, what, r))
- {
- // extract $0 as a CString:
- return CString(what[0].first, what.length());
- }
- else
- {
- throw std::runtime_error("No postcode found");
- }
- }
- void enumerate_links(const CString& html)
- {
- // enumerate and print all the <a> links in some HTML text,
- // the expression used is by Andew Lee on www.regxlib.com:
- boost::tregex r(__T("href=[\"\']((http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?)[\"\']"));
- boost::tregex_iterator i(boost::make_regex_iterator(html, r)), j;
- while(i != j)
- {
- std::cout << (*i)[1] << std::endl;
- ++i;
- }
- }
- void enumerate_links2(const CString& html)
- {
- // enumerate and print all the <a> links in some HTML text,
- // the expression used is by Andew Lee on www.regxlib.com:
- boost::tregex r(__T("href=[\"\']((http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?)[\"\']"));
- boost::tregex_token_iterator i(boost::make_regex_token_iterator(html, r, 1)), j;
- while(i != j)
- {
- std::cout << *i << std::endl;
- ++i;
- }
- }
- //
- // Take a credit card number as a string of digits,
- // and reformat it as a human readable string with "-"
- // separating each group of four digits:
- //
- const boost::tregex e(__T("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"));
- const CString human_format = __T("$1-$2-$3-$4");
- CString human_readable_card_number(const CString& s)
- {
- return boost::regex_replace(s, e, human_format);
- }
- int main()
- {
- // password checks using regex_match:
- CString pwd = "abcDEF---";
- CString pwd_check = "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}";
- bool b = is_valid_password(pwd, pwd_check);
- assert(b);
- pwd = "abcD-";
- b = is_valid_password(pwd, pwd_check);
- assert(!b);
- // filename extraction with regex_match:
- CString file = "abc.hpp";
- file = get_filename(file);
- assert(file == "abc.hpp");
- file = "c:\\a\\b\\c\\d.h";
- file = get_filename(file);
- assert(file == "d.h");
- // postcode extraction with regex_search:
- CString address = "Joe Bloke, 001 Somestreet, Somewhere,\nPL2 8AB";
- CString postcode = extract_postcode(address);
- assert(postcode = "PL2 8NV");
- // html link extraction with regex_iterator:
- CString text = "<dt><a href=\"syntax_perl.html\">Perl Regular Expressions</a></dt><dt><a href=\"syntax_extended.html\">POSIX-Extended Regular Expressions</a></dt><dt><a href=\"syntax_basic.html\">POSIX-Basic Regular Expressions</a></dt>";
- enumerate_links(text);
- enumerate_links2(text);
- CString credit_card_number = "1234567887654321";
- credit_card_number = human_readable_card_number(credit_card_number);
- assert(credit_card_number == "1234-5678-8765-4321");
- return 0;
- }
- #else
- #include <iostream>
- int main()
- {
- std::cout << "<NOTE>MFC support not enabled, feature unavailable</NOTE>";
- return 0;
- }
- #endif
|