happyboy200032的博客

VS2008 SP1自带的正则表达式

// 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.


https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx

评论

技术经验积累

© happyboy200032的博客 | Powered by LOFTER