• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright (c) 2004
4  * John Maddock
5  *
6  * Use, modification and distribution are subject to the
7  * Boost Software License, Version 1.0. (See accompanying file
8  * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9  *
10  */
11 
12  /*
13   *   LOCATION:    see http://www.boost.org for most recent version.
14   *   FILE         mfc_example.cpp
15   *   VERSION      see <boost/version.hpp>
16   *   DESCRIPTION: examples of using Boost.Regex with MFC and ATL string types.
17   */
18 
19 #ifdef TEST_MFC
20 
21 #include <boost/regex/mfc.hpp>
22 #include <cstringt.h>
23 #include <atlstr.h>
24 #include <assert.h>
25 #include <tchar.h>
26 #include <iostream>
27 
28 #ifdef _UNICODE
29 #define cout wcout
30 #endif
31 
32 //
33 // Find out if *password* meets our password requirements,
34 // as defined by the regular expression *requirements*.
35 //
is_valid_password(const CString & password,const CString & requirements)36 bool is_valid_password(const CString& password, const CString& requirements)
37 {
38    return boost::regex_match(password, boost::make_regex(requirements));
39 }
40 
41 //
42 // Extract filename part of a path from a CString and return the result
43 // as another CString:
44 //
get_filename(const CString & path)45 CString get_filename(const CString& path)
46 {
47    boost::tregex r(__T("(?:\\A|.*\\\\)([^\\\\]+)"));
48    boost::tmatch what;
49    if(boost::regex_match(path, what, r))
50    {
51       // extract $1 as a CString:
52       return CString(what[1].first, what.length(1));
53    }
54    else
55    {
56       throw std::runtime_error("Invalid pathname");
57    }
58 }
59 
extract_postcode(const CString & address)60 CString extract_postcode(const CString& address)
61 {
62    // searches throw address for a UK postcode and returns the result,
63    // the expression used is by Phil A. on www.regxlib.com:
64    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})$"));
65    boost::tmatch what;
66    if(boost::regex_search(address, what, r))
67    {
68       // extract $0 as a CString:
69       return CString(what[0].first, what.length());
70    }
71    else
72    {
73       throw std::runtime_error("No postcode found");
74    }
75 }
76 
enumerate_links(const CString & html)77 void enumerate_links(const CString& html)
78 {
79    // enumerate and print all the <a> links in some HTML text,
80    // the expression used is by Andew Lee on www.regxlib.com:
81    boost::tregex r(__T("href=[\"\']((http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?)[\"\']"));
82    boost::tregex_iterator i(boost::make_regex_iterator(html, r)), j;
83    while(i != j)
84    {
85       std::cout << (*i)[1] << std::endl;
86       ++i;
87    }
88 }
89 
enumerate_links2(const CString & html)90 void enumerate_links2(const CString& html)
91 {
92    // enumerate and print all the <a> links in some HTML text,
93    // the expression used is by Andew Lee on www.regxlib.com:
94    boost::tregex r(__T("href=[\"\']((http:\\/\\/|\\.\\/|\\/)?\\w+(\\.\\w+)*(\\/\\w+(\\.\\w+)?)*(\\/|\\?\\w*=\\w*(&\\w*=\\w*)*)?)[\"\']"));
95    boost::tregex_token_iterator i(boost::make_regex_token_iterator(html, r, 1)), j;
96    while(i != j)
97    {
98       std::cout << *i << std::endl;
99       ++i;
100    }
101 }
102 
103 //
104 // Take a credit card number as a string of digits,
105 // and reformat it as a human readable string with "-"
106 // separating each group of four digits:
107 //
108 const boost::tregex e(__T("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"));
109 const CString human_format = __T("$1-$2-$3-$4");
110 
human_readable_card_number(const CString & s)111 CString human_readable_card_number(const CString& s)
112 {
113    return boost::regex_replace(s, e, human_format);
114 }
115 
116 
main()117 int main()
118 {
119    // password checks using regex_match:
120    CString pwd = "abcDEF---";
121    CString pwd_check = "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}";
122    bool b = is_valid_password(pwd, pwd_check);
123    assert(b);
124    pwd = "abcD-";
125    b = is_valid_password(pwd, pwd_check);
126    assert(!b);
127 
128    // filename extraction with regex_match:
129    CString file = "abc.hpp";
130    file = get_filename(file);
131    assert(file == "abc.hpp");
132    file = "c:\\a\\b\\c\\d.h";
133    file = get_filename(file);
134    assert(file == "d.h");
135 
136    // postcode extraction with regex_search:
137    CString address = "Joe Bloke, 001 Somestreet, Somewhere,\nPL2 8AB";
138    CString postcode = extract_postcode(address);
139    assert(postcode = "PL2 8NV");
140 
141    // html link extraction with regex_iterator:
142    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>";
143    enumerate_links(text);
144    enumerate_links2(text);
145 
146    CString credit_card_number = "1234567887654321";
147    credit_card_number = human_readable_card_number(credit_card_number);
148    assert(credit_card_number == "1234-5678-8765-4321");
149    return 0;
150 }
151 
152 #else
153 
154 #include <iostream>
155 
main()156 int main()
157 {
158    std::cout << "<NOTE>MFC support not enabled, feature unavailable</NOTE>";
159    return 0;
160 }
161 
162 #endif
163