返回> 网站首页 

STL正则表达式

yoours2013-05-31 17:38:43 阅读 1823

简介一边听听音乐,一边写写文章。

#include <vector>
#include <regex>
#include <string>

#include <numeric>

#include <iostream>
#include <sstream>

using namespace std;
using namespace tr1;

// 格式化输出Output窗口
#ifdef _UNICODE
void MyTRACE(wchar_t *fmts, ...)
#else
void MyTRACE(char *fmts, ...)
#endif
{
#ifdef _DEBUG
#ifdef _UNICODE
wchar_t buffer[1024];
memset(buffer, 0, 1024*sizeof(wchar_t));
#else
char buffer[1024];
memset(buffer, 0, 1024*sizeof(char));
#endif

va_list va;
va_start(va, fmts);

#ifdef _UNICODE
vswprintf(buffer, fmts, va);
#else
sprintf(buffer, fmts, va);
#endif

va_end(va);

#ifdef _UNICODE
OutputDebugStringW(buffer);
#else
OutputDebugString(buffer);
#endif
#endif
}

void Test1()
{
    std::string text(_T("我的IP地址是:109.168.0.1."));
    std::string newIP(_T("127.0.0.1"));
    std::string regString(_T("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"));

// std::count输出转向
std::ostringstream oss;
    std::streambuf* pOldBuf = std::cout.rdbuf(oss.rdbuf());

    // 表达式选项 - 忽略大小写
regex_constants::syntax_option_type fl = regex_constants::syntax_option_type::icase;
    // 编译一个正则表达式语句
    regex regExpress(regString, fl);

    // 保存查找的结果
    smatch ms;
    // 判断是否全行匹配
    if(regex_match(text, ms, regExpress))
    {
        std::cout<<_T("正则表达式:")<<regString<<_T("匹配:")<<text<<_T("成功.")<<std::endl;
    }else{
        std::cout<<_T("正则表达式:")<<regString<<_T("匹配:")<<text<<_T("失败.")<<std::endl;
    }

    // 查找 子字符串
    if(regex_search(text, ms, regExpress))
    {
        std::cout<<_T("正则表达式:")<<regString<<_T("查找:")<<text<<_T("成功.")<<std::endl;
        for(size_t i= 0; i < ms.size(); ++i)
        {
            std::cout<<_T("第")<<i<<_T("个结果:\"")<<ms.str(i)<<_T("\" - ");
            std::cout<<_T("起始位置:")<<ms.position(i)<<_T("长度")<<ms.length(i)<<std::endl;
        }
        std::cout<<std::endl;

        // 替换1 - 根据起始结束地址
        text = text.replace(ms[0].first, ms[0].second, newIP);
        std::cout<<_T("替换1后的文本:")<<text<<std::endl;
    }else{
        std::cout<<_T("正则表达式:")<<regString<<_T("查找:")<<text<<_T("失败.")<<std::endl;
    }

    // 替换2 根据正则表达式替换
    newIP = _T("255.255.0.0");
    std::string newText = regex_replace( text, regExpress, newIP);
    std::cout<<_T("替换2后的文本:")<<newText<<std::endl;

std::string ret = oss.str();
std::cout.rdbuf(pOldBuf);//恢复cout的流对象指针
TRACE(ret.c_str());
}

void Test2()
{
    string seq = "111|13|2|5000|";

// 表达式选项 - 忽略大小写
regex_constants::syntax_option_type fl = regex_constants::syntax_option_type::icase;
regex rgx("([0-9]+)", fl);

// 查找所有符合的记录
    regex_iterator<string::iterator> it(seq.begin(), seq.end(), rgx);
    regex_iterator<string::iterator> end;

// std::count输出转向
std::ostringstream oss;
    std::streambuf* pOldBuf = std::cout.rdbuf(oss.rdbuf());

// 输出所有查询结果
short cnt=0;
    vector<int> v_int;
    while (it!=end)
    {
        cout<<++cnt<<"\t:";
        // strtol 将字符串转换为指定进制的数
        v_int.push_back(strtol(it->str().c_str(), NULL, 10));
        cout<<it++->str()<<endl;

    }

// 对集合中数据求和
    cout<<endl<<"总和:"<<accumulate(v_int.begin(), v_int.end(), 0)<<endl;//表示 0 + v_int[0] + v_int[1] + ...
    cout<<endl<<"求差:"<<accumulate(v_int.begin(),v_int.end(),0,minus<int>())<<endl;//表示 0 - v_int[0] - v_int[1] - ...

std::string ret = oss.str();
std::cout.rdbuf(pOldBuf);//恢复cout的流对象指针
TRACE(ret.c_str());
}

void Test3()
{
string pattern(_T("([0-9]+)[a-z]+([0-9]+)"));
    // 表达式选项 - 忽略大小写
    regex_constants::syntax_option_type fl = regex_constants::syntax_option_type::icase;
    // 编译一个正则表达式语句
    regex regExpress(pattern, fl);
    // 保存查找的结果
    smatch ms;

// std::count输出转向
std::ostringstream oss;
    std::streambuf* pOldBuf = std::cout.rdbuf(oss.rdbuf());

string strTxt = "399df5d2f55gg57t45fg789hjh546";
// 正则查找 标签ID NextMatch
if (regex_search(strTxt, ms, regExpress))
{
// index through submatches
for (size_t n = 0; n < ms.size(); ++n)
{
// n = 0: 表达式匹配的完整字符串
// n = 1: 第一个查找的元素
// ......
std::cout << "submatch[" << n << "]: matched == " << std::boolalpha <<  ms[n].matched << " at position " << ms.position(n) << "  " << ms.length(n) << " chars, value == " << ms[n] << std::endl;
}

// iterate through submatches
for (smatch::iterator it = ms.begin(); it != ms.end(); ++it)
{
std::cout << "next submatch: matched == " << std::boolalpha << it->matched << "  " << it->length() << " chars, value == " << *it << std::endl;
}

std::string ret = oss.str();
std::cout.rdbuf(pOldBuf);//恢复cout的流对象指针
TRACE(ret.c_str());
}
}

微信小程序扫码登陆

文章评论

1823人参与,0条评论