原创 本人学习正则表达式时所编写的第一个学习程序

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: 在此处添加消息处理程序代码
}
/////////////////////////////////////////////////////////////////////////////

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条