返回> 网站首页 

VS2008 SP1自带的正则表达式

yoours2012-01-07 20:22:17 阅读 1238

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

// VS2008 SP1
// C++ TR1正则库

一、例子
#include <regex>
#include <string>
using namespace std;
using namespace std::tr1;
void CMyTestDlg::OnBnClickedOk()
{
std::wstring data(L"<h2>Egg prices</h2>");
std::tr1::wregex rx(L"<h(.)>([^<]+)");
std::tr1::wsmatch mt;

std::wstring::const_iterator itS = data.begin();// not include the date prefix
std::wstring::const_iterator itE = data.end();

bool bMatched = std::tr1::regex_search(itS, itE, mt, rx);
while (bMatched)
{
std::wstring sName = mt.str(1);
std::wstring sLink = mt.str(2);

itS = mt[0].second;
itE = data.end();
bMatched = std::tr1::regex_search(itS, itE, mt, rx);
}
}

二、例子
    wchar_t info[500];
    wstring text(_T("我的IP地址是:109.168.0.1."));
    wstring newIP(_T("127.0.0.1"));
    wstring regString(_T("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"));

    // 表达式选项 - 忽略大小写
    regex_constants::syntax_option_type fl = regex_constants::icase;
    // 编译一个正则表达式语句
    wregex regExpress(regString, fl);
    // 保存查找的结果
    wsmatch ms;

    // 判断是否全行匹配
    if(regex_match(text, ms, regExpress))
    {
wsprintf(info, L"正则表达式:%s 匹配:成功.\n", regString.c_str());
OutputDebugString(info);
    }else{
wsprintf(info, L"正则表达式:%s 匹配:失败.\n", regString.c_str());
OutputDebugString(info);
    }

  size_t i;
    // 查找
    while(regex_search(text, ms, regExpress))
    {
wsprintf(info, L"正则表达式:%s 查找:成功.\n", regString.c_str());
OutputDebugString(info);
        for(i= 0; i < ms.size(); ++i)
        {
wsprintf(info, L"第%d个结果:%s - 起始位置:%d 长度:%d\n", i, ms.str(i).c_str(), ms.position(i), ms.length(i));
OutputDebugString(info);
        }

text = ms.suffix().str();
        // 替换1
        //text = text.replace(ms[0].first, ms[0].second, newIP);
//wsprintf(info, L"替换1后的文本:%s\n", text.c_str());
//OutputDebugString(info);
    }

  if (0)
  {
wsprintf(info, L"正则表达式:%s 查找:%s 失败.\n", regString.c_str(), text.c_str());
OutputDebugString(info);
    }

    // 替换2
    newIP = _T("255.255.0.0");
    wstring newText = regex_replace(text, regExpress, newIP);
  wsprintf(info, L"替换2后的文本:%s\n", newText.c_str());
  OutputDebugString(info);

[说明]
1. 创建正则表达式对象,有3中方法:
(1) 使用构造函数
std::regex_constants::syntax_option_type fl = std::regex_constants::icase; // 语法选项,可以设置使用哪种风格的正则表达式语法等.
std::wregex regExpress(regString, fl);
(2) 使用赋值运算符,缺点是不能指定语法选项,而且也比较低效.
std::wregex regExpress;
regExpress = regString;
(3) 使用assign方法.
std::wregex regExpress;
regExpress.assign(regString, fl);
构造正则对象的过称就是所谓的"编译".

2. regex_match() 和 regex_search()
regex_match()只有在整个字符串匹配正则表达式时才返回 true, 而 regex_search()在子串匹配就返回 true.

http://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx
微信小程序扫码登陆

文章评论

1238人参与,0条评论