返回> 网站首页
STL正则表达式
yoours2013-05-31 17:38:43
简介一边听听音乐,一边写写文章。
#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条评论