Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/regex/example/snippets/mfc_example.cpp @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 4.5 KB
Line 
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//
36bool 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//
45CString 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
60CString 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
77void 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
90void 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//
108const boost::tregex e(__T("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"));
109const CString human_format = __T("$1-$2-$3-$4");
110
111CString human_readable_card_number(const CString& s)
112{
113   return boost::regex_replace(s, e, human_format);
114}
115
116
117int 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
156int main()
157{
158   std::cout << "<NOTE>MFC support not enabled, feature unavailable</NOTE>";
159   return 0;
160}
161
162#endif
Note: See TracBrowser for help on using the repository browser.