[C/C++11]_[初级]_[使用正则表达式库进行分组查询]

场景

1.正则表达式在查询替换字符串数据时效率很高, 可以节省很多不必要的查询代码. 特别是对字符串分组的查询, 可以说如果没有正则表达式,查询分组里的字符串需要写很多额外的代码,还不一定准确.

2.查询并替换XML标签是比较常见的需求, 比如过滤掉HTML标签里的标签, 提取字符串内容等.

例子

1.这里举例了C++正则库的分组查询功能, 一个用于提取特定字符串, 一个用于替换字符串.


// test-regexp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <regex>
#include <iostream>

std::wstring PickLinkShowContent(const wchar_t* buf1){

    std::wstring buf(buf1);
    std::wregex pattern(L"(<A HREF=\"[^\"]*\">)([^<]*)(</A>)",
        std::regex_constants::ECMAScript|std::regex_constants::icase);
    auto words_begin =
        std::wsregex_iterator(buf.begin(), buf.end(), pattern);
    auto words_end = std::wsregex_iterator();

    std::wstring result;
    int start = 0;
    int end = 0;
    for (std::wsregex_iterator i = words_begin; i != words_end; ++i)
    {
        std::wsmatch match = *i;
        size_t pos = match.position();
        size_t length = match.length();

        std::wstring prev = buf.substr(start,pos-start);

        result.append(prev);
        result.append(match[2]);
        end = pos+length;
        start = pos+length;
    }

    if(end+1 != buf.length()){
        result.append(buf.substr(end));
    }
    return result;
}

std::string ReplaceStr(const char* text,const char* old,const char* _new){
    std::regex pattern(old);
    std::string rep(_new);
    std::string text1(text);
    std::string tmp = std::regex_replace(text1,pattern,rep);
    return tmp;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "Test regex group 1" << std::endl;
    const wchar_t* buf = L"You haven't installed QQPCMgr on this computer. "
        L"Please <a HREF=\"http://www.qq.com\">download</A> and install the latest QQPCMgr first, "
        L"then reboot the program.";
    auto result = PickLinkShowContent(buf);
    std::wcout << result << std::endl;

    std::cout << "Test regex group 2" << std::endl;
    static const char* buf2 = ""
        "<key>name</key>"
            "<string>百度</string><key>position</key>"
            "<string>2</string>"
        "</dict>"
        "<key>05975BCB-FD95-48A4-A912-37ECACD39871</key>"
        "<dict>"
            "<key>name</key>"
            "<string>必应</string>"
            "<key>url</key>"
            "<string>http://www.bing.com/</string>"
            "<key>position</key>"
            "<string>3</string>";

    auto result2 = ReplaceStr(buf2,"(<key>position</key>[^<]*)(<string>)([0-9]*)(</string>)",
        "$1<integer>$3</integer>");
    std::cout << result2 << std::endl;
    system("pause");
    return 0;
}


````

输出





<div class="se-preview-section-delimiter"></div>

``` XML
Test regex group 1
You haven't installed QQPCMgr on this computer. Please download and install the
latest QQPCMgr first, then reboot the program.
Test regex group 2
<key>name</key><string>百度</string><key>position</key><integer>2</integer></dic
t><key>05975BCB-FD95-48A4-A912-37ECACD39871</key><dict><key>name</key><string>必
应</string><key>url</key><string>http://www.bing.com/</string><key>position</key
><integer>3</integer>

参考

std::regex_replace
使用正则表达式库regex

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值