原创
本人学习正则表达式时所编写的第一个学习程序
2009-7-25 12:55
3102
9
9
分类:
软件与OS
///////////////////////////////////////////////////////////////////////////// 本人学习正则表达式时所编写的第一个学习程序,全部是从网上搜集整理而成, 如果你第一次接触 正则表达式,希望这个例子对你有所帮助,请注意,本 文中所提到的正则表达式的写法不是唯一的,各人的写法可能不一样,另外, 由于博客空间排版的限制,部分正则表达式被分成几行了,本来应该是一行。///////////////////////////////////////////////////////////////////////////// // TestDlg.cpp : 实现文件 #include "stdafx.h" #include "Test.h" #include "TestDlg.h" #include <boost/regex.hpp> #include <boost/lexical_cast.hpp> #include <iostream> #include <string> #include <cstdlib> #include <stdlib.h> using namespace std; using namespace boost; #ifdef _DEBUG #define new DEBUG_NEW #endif ///////////////////////////////////////////////////////////////////////////// // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } ///////////////////////////////////////////////////////////////////////////// void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } ///////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_WM_DESTROY() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_REGEX_TEST1, &CTestDlg::OnBnClickedRegexTest1) ON_BN_CLICKED(IDC_REGEX_TEST2, &CTestDlg::OnBnClickedRegexTest2) ON_BN_CLICKED(IDC_REGEX_TEST3, &CTestDlg::OnBnClickedRegexTest3) ON_BN_CLICKED(IDC_REGEX_TEST4, &CTestDlg::OnBnClickedRegexTest4) ON_BN_CLICKED(IDC_REGEX_TEST5, &CTestDlg::OnBnClickedRegexTest5) ON_BN_CLICKED(IDC_REGEX_TEST6, &CTestDlg::OnBnClickedRegexTest6) ON_BN_CLICKED(IDC_REGEX_TEST7, &CTestDlg::OnBnClickedRegexTest7) ON_BN_CLICKED(IDC_REGEX_TEST8, &CTestDlg::OnBnClickedRegexTest8) ON_BN_CLICKED(IDC_REGEX_TEST9, &CTestDlg::OnBnClickedRegexTest9) ON_BN_CLICKED(IDC_REGEX_TEST10, &CTestDlg::OnBnClickedRegexTest10) ON_BN_CLICKED(IDOK, &CTestDlg::OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, &CTestDlg::OnBnClickedCancel) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestDlg 对话框 CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } ///////////////////////////////////////////////////////////////////////////// // CTestDlg 消息处理程序 BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if(pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } ///////////////////////////////////////////////////////////////////////////// // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } ///////////////////////////////////////////////////////////////////////////// //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CTestDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } ///////////////////////////////////////////////////////////////////////////// // 匹配至少一个a void CTestDlg::OnBnClickedRegexTest1() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "aaa"; std::string regstr = "a+"; boost::regex expression(regstr); if(boost::regex_match(testString, expression)) AfxMessageBox(_T("Match")); else AfxMessageBox(_T("Not Match")); } ///////////////////////////////////////////////////////////////////////////// // 判定一个字符串是不是合法的IP地址 void CTestDlg::OnBnClickedRegexTest2() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "119.141.0.0"; std::string regstr = "(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])"; boost::regex expression(regstr); // 匹配ip Address if(boost::regex_match(testString, expression)) AfxMessageBox(_T("This is an ip address")); else AfxMessageBox(_T("This is not an ip address")); } ///////////////////////////////////////////////////////////////////////////// // 把所有的IP的单个数字打印出来 void CTestDlg::OnBnClickedRegexTest3() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "119.141.200.20"; std::string regstr = "(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])\\.(1?\\d{1,2}|2[01234]\\d|25[12345])"; boost::regex expression(regstr); boost::smatch what; if(boost::regex_match(testString, what, expression)) { AfxMessageBox(_T("This is an ip address")); for(int i=0; i<=4; i++) { std::string msg0(what.first, what.second); CString strTemp(""); strTemp = msg0.c_str(); AfxMessageBox(strTemp); } } else AfxMessageBox(_T("This is not an ip address")); } ///////////////////////////////////////////////////////////////////////////// // 检测给出的字符串中是否包含数字 void CTestDlg::OnBnClickedRegexTest4() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "192.168.4.1"; std::string regstr = "\\d+"; boost::regex expression(regstr); //boost::smatch what; if(boost::regex_search(testString, expression)) AfxMessageBox(_T("Have digit(s)")); } ///////////////////////////////////////////////////////////////////////////// // 打印出所有的数字 void CTestDlg::OnBnClickedRegexTest5() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "192.168.4.1"; std::string regstr = "(\\d+)"; boost::regex expression(regstr); boost::smatch what; std::string::const_iterator start = testString.begin(); std::string::const_iterator end = testString.end(); while(boost::regex_search(start, end, what, expression)) { AfxMessageBox(_T("Have digit(s)")); std::string msg0(what[1].first, what[1].second); CString strTemp(""); strTemp = msg0.c_str(); AfxMessageBox(strTemp); start = what[0].second; } } ///////////////////////////////////////////////////////////////////////////// // 由于"+"号或者"*"号等重复符号带来的副作用,这些符号会消耗尽可能多的输入, // 使之是“贪婪”的。即正则表达式(.*)会匹配最长的串,而不是匹配最短的成功串。 // 如何使得这些重复的符号不再“贪婪”,我们在重复符号后加上"?"即可。 void CTestDlg::OnBnClickedRegexTest6() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "My age is 28 His age is 27"; std::string regstr = "(.*?)(age)(.*?)(\\d{2})"; boost::regex expression(regstr); boost::smatch what; std::string::const_iterator start = testString.begin(); std::string::const_iterator end = testString.end(); while(boost::regex_search(start, end, what, expression)) { std::string name(what[1].first, what[1].second); std::string age(what[4].first, what[4].second); CString strTemp(""); strTemp = "Name:"; strTemp += name.c_str(); AfxMessageBox(strTemp); strTemp = "Age:"; strTemp += age.c_str(); AfxMessageBox(strTemp); start = what[0].second; } } ///////////////////////////////////////////////////////////////////////////// // 去除左侧无效字符(空格,回车,TAB)的正则表达式。 void CTestDlg::OnBnClickedRegexTest7() { // TODO: 在此添加控件通知处理程序代码 std::string testString = " \r\n Hello World! GoodBye World.\r\n"; std::string TrimLeft = "([\\s\\r\\n\\t]*)(\\w*.*)"; boost::regex expression(TrimLeft); testString = boost::regex_replace(testString, expression, "$2"); CString strTemp(""); strTemp = testString.c_str(); AfxMessageBox(strTemp); } ///////////////////////////////////////////////////////////////////////////// // Match a dollar sign followed by one or more digits, // optionally followed by a period and two more digits. // The double-escapes are necessary to satisfy the compiler. void CTestDlg::OnBnClickedRegexTest8() { // TODO: 在此添加控件通知处理程序代码 std::string testString = "$120.34"; std::string regstr = "(\\$)(\\d+)(\\.(\\d{2}))?"; boost::regex express(regstr); boost::smatch what; if(boost::regex_match(testString, what, express)) { AfxMessageBox(_T("match success!")); for(int i=0; i<=4; i++) { std::string msg0(what.first, what.second); CString strTemp(""); strTemp = msg0.c_str(); AfxMessageBox(strTemp); } } else AfxMessageBox(_T("match failed!")); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnBnClickedRegexTest9() { // TODO: 在此添加控件通知处理程序代码 // 字符串→数值 using boost::lexical_cast; int a = lexical_cast<int>("123"); double b = lexical_cast<double>("123.12"); CString strTemp(""); strTemp.Format(_T("%d %f"), a, b); AfxMessageBox(strTemp); // 数值→字符串 using std::string; const double d = 321.12; string s = boost::lexical_cast<string>(d); //CString strTemp(""); strTemp = s.c_str(); AfxMessageBox(strTemp); // 异常处理: 如果转换失败,则会有异常bad_lexical_cast抛出。该异常类是标准异常类bad_cast的子类。 int i; try { i = boost::lexical_cast<int>("abcd"); } catch(boost::bad_lexical_cast &e) { //CString strTemp(""); strTemp.Format(_T("%s"), e.what()); AfxMessageBox(strTemp); } } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnBnClickedRegexTest10() { // TODO: 在此添加控件通知处理程序代码 string testString = "select name from table"; string regstr = "^select ([a-zA-Z]*) from ([a-zA-Z]*)$"; regex express(regstr); smatch what; if(regex_match(testString, what, express)) { AfxMessageBox(_T("match success!")); for(int i=0; i<what.size(); i++) { CString strTemp(""); strTemp = what.str().c_str(); AfxMessageBox(strTemp); } } else AfxMessageBox(_T("match failed!")); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 OnOK(); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 OnCancel(); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialog::OnClose(); } ///////////////////////////////////////////////////////////////////////////// void CTestDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: 在此处添加消息处理程序代码 } /////////////////////////////////////////////////////////////////////////////
文章评论(0条评论)
登录后参与讨论