boost regex

编译参数加上 -lboost_regex

#include <boost/xpressive/xpressive_dynamic.hpp>
using namespace std;
//c++ 验证ip地址
bool VerifyIP() {
    boost::xpressive::cregex reg_ip = boost::xpressive::cregex::compile("(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])[."
            "](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[.](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|["
            "1-9][0-9]|[0-9])[.](25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])"); /* 定义正则表达式 */
    return boost::xpressive::regex_match("127.0.0.1", reg_ip);
}
#include <boost/regex.hpp>
void test001()
{
     //( 1 )   ((  3  )  2 )((  5 )4)(    6    )   
    //(/w+)://((/w+/.)*/w+)((//w*)*)(//w+/./w+)?
    //^协议://网址(x.x...x)/路径(n个/字串)/网页文件(xxx.xxx)
    const char *szReg = "(//w+)://((//w+//.)*//w+)((///w*)*)(///w+//.//w+)?";
    const char *szStr = "http://www.cppprog.com/2009/0112/48.html";
    { //字符串匹配
        boost::regex reg(szReg);
        bool r = boost::regex_match(szStr, reg);
       // assert(r);
        cout<<"字符串匹配:"<<r<<endl;
    }
    { //提取子串
        boost::cmatch mat;
        boost::regex reg(szReg);
        bool r = boost::regex_match(szStr, mat, reg);
        if (r) //如果匹配成功
        {
            //显示所有子串
            for (boost::cmatch::iterator itr = mat.begin(); itr != mat.end(); ++itr) {
                //       指向子串对应首位置        指向子串对应尾位置          子串内容
                cout << itr->first - szStr << ' ' << itr->second - szStr << ' ' << *itr << endl;
            }
        }
        //也可直接取指定位置信息
        if (mat[4].matched) cout << "Path is" << mat[4] << endl;
    }
    { //查找
        boost::cmatch mat;
        boost::regex reg("//d+"); //查找字符串里的数字
        if (boost::regex_search(szStr, mat, reg)) {
            cout << "searched:" << mat[0] << endl;
        }
    }
    { //替换
        boost::regex reg(szReg);
        string s = boost::regex_replace(string(szStr), reg, "ftp://$2$5");
        cout << "ftp site:" << s << endl;
    }
    { //替换2,把<>&转换成网页字符
        string s1 = "(<)|(>)|(&)";
        string s2 = "(?1<)(?2>)(?3&)";
        boost::regex reg(s1);
        string s = boost::regex_replace(string("cout << a&b << endl;"), reg, s2, boost::match_default | boost::format_all);
        cout << "HTML:" << s << endl;
    }
    { //使用迭代器找出所有数字
        boost::regex reg("//d+"); //查找字符串里的数字
        boost::cregex_iterator itrBegin = make_regex_iterator(szStr, reg); //(szStr, szStr+strlen(szStr), reg);
        boost::cregex_iterator itrEnd;
        for (boost::cregex_iterator itr = itrBegin; itr != itrEnd; ++itr) {
            //       指向子串对应首位置        指向子串对应尾位置          子串内容
            cout << (*itr)[0].first - szStr << ' ' << (*itr)[0].second - szStr << ' ' << *itr << endl;
        }
    }
    { //使用迭代器拆分字符串
        boost::regex reg("/"); //按/符拆分字符串
        boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr, reg, -1); //使用-1参数时拆分,使用其它数字时表示取第几个子串,可使用数组取多个串
        boost::cregex_token_iterator itrEnd;
        for (boost::cregex_token_iterator itr = itrBegin; itr != itrEnd; ++itr) {
            cout << *itr << endl;
        }
    }

    { //使用迭代器拆分字符串2
        boost::regex reg("(.)/(.)"); //取/的前一字符和后一字符(这个字符串形象貌似有点邪恶-_-)
        int subs[] = {1, 2}; // 第一子串和第二子串
        boost::cregex_token_iterator itrBegin = make_regex_token_iterator(szStr, reg, subs); //使用-1参数时拆分,使用其它数字时表示取第几个子串,可使用数组取多个串
        boost::cregex_token_iterator itrEnd;
        for (boost::cregex_token_iterator itr = itrBegin; itr != itrEnd; ++itr) {
            cout << *itr << endl;
        }
    }
}
int main() {
    std::cout << VerifyIP() << std::endl;
    std::cout << "ok" << std::endl;
    test001();
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值