C++ regex库的三种正则表达式操作

关于正则表达式的语法和字符含义

读懂正则表达式就这么简单 - Zery - 博客
正则表达式 – 语法 | 菜鸟教程

如何使用C++的regex库完成正则匹配,正则查找,正则替换三种操作

首先是头文件

#include<regex>
using namespace std;

正则表达式声明

string str("\\d{4}");
regex pattern(str,regex::icase);

注意与一般应用正则表达式不同,这里的转义符号要用“\”

匹配结果存放变量声明

//第一种存储方式
match_results<string::const_iterator> result;
//第二种存储方式
smatch result;

这两个类都可以存储匹配得到的结果,建议使用第二种,比较方便

数据准备

//文本数据
string str="1994 is my birth year";

正则操作

正则匹配

//正则匹配
string regex_str2("(\\d{4}).*");
regex pattern2(regex_str2,regex::icase);

if(regex_match(str,result,pattern2)){
 cout<<result[0]<<endl;
 cout<<result[1]<<endl;
}

注意正则匹配的运算规则是先检查正则表达式是否与文本数据一致,只有在一致的条件下才会将匹配结果送入result中。例如将正则表达式改为("\d{4}"),返回值为FALSE,result中根本没有结果。下图是运行结果。我们从中看出result[0]是完整的文本,result[1]是第一个分组匹配的数据。如果正则表达式有n个分组,result的size也就是n+1个

正则查找

//文本数据
string str="1994 is my birth year";
//正则表达式
string regex_str("\\d{4}");
regex pattern1(regex_str,regex::icase);

//迭代器声明
string::const_iterator iter = str.begin();
string::const_iterator iterEnd= str.end();
string temp;
//正则查找
while (std::regex_search(iter,iterEnd,result,pattern1))
{
   temp=result[0];
   cout<<temp<<endl;
   iter = result[0].second; //更新搜索起始位置
}

首先声明迭代器,在用while循环查找,每一次查找只会匹配一个结果

正则替换

//正则替换
    std::regex reg1("\\d{4}");
    string t("1993");
    str = regex_replace(str,reg1,t); //trim_left
    cout<<str<<endl;

在str查找匹配的文本,并用t中的数据替换。经检验,这个函数会遍历整个文本变量,也就是文本变量中所有符合正则表达式的数据都会被替换

最后附上所有代码

int main(){

    //第一种存储方式
    //match_results<string::const_iterator> result;
    //第二种存储方式
    smatch result;

    //文本数据
    string str="1994 is my birth year 1994";
    //正则表达式
    string regex_str("\\d{4}");
    regex pattern1(regex_str,regex::icase);

    //迭代器声明
    string::const_iterator iter = str.begin();
    string::const_iterator iterEnd= str.end();
    string temp;
    //正则查找
    while (std::regex_search(iter,iterEnd,result,pattern1))
    {
        temp=result[0];
        cout<<temp<<endl;
        iter = result[0].second; //更新搜索起始位置
    }

    //正则匹配
    string regex_str2("(\\d{4}).*");
    regex pattern2(regex_str2,regex::icase);

    if(regex_match(str,result,pattern2)){
        cout<<result[0]<<endl;
        cout<<result[1]<<endl;
    }
    
    //正则替换
    std::regex reg1("\\d{4}");
    string t("1993");
    str = regex_replace(str,reg1,t); //trim_left
    cout<<str<<endl;
        
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值