目录
正则表达式(regular expression)的C++库regex是一种强大的描述字符序列的工具 , C++11中也将正则表达式纳入了新标准的一部分 。
在头文件<regex>中包含了多个我们使用正则表达式时需要用到的组件,即 #include<regex>
regex库组件详细介绍如下
regex | 表示有一个正则表达式类,比如:regex pattern("(.{3})(.{2})_(\d{4})!") |
---|---|
regex_match | 全文匹配,要求整个字符串符合正则表达式的匹配规则。用来判断一个字符串和一个正则表达式是否模式匹配,返回一个 bool 值,true 为匹配,false 为不匹配。匹配的含义是目标字符串必须完全和正则表达式相匹配,不能有多余的字符,如果需要部分匹配则应使用regex_search |
regex_search | 搜索匹配,根据正则表达式来搜索字符串中是否存在符合规则的子字符串。 能和正则表达式相匹配就返回true |
regex_replace | 替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容 |
sregex_iterator | 迭代器适配器,调用regex_search来遍历一个string中所有匹配的子串 |
smatch/match_results | 容器类,保存在string中搜索的结果。如果匹配成功,这些函数将成功匹配的相关信息保存在给定的smatch对象中。比如:smatch results;将匹配结果存放在results中,另一种存储方法声明:match_results<string::const_iterator> result |
//头文件包含
#include<regex>
#include<iostream>
using namespace std;
//匹配结果存放声明
smatch results; //match_results<string::const_iterator> results;是第二种存储方法
//匹配字符串和正则pattern准备
string str = "2019年12月看的电视hhhhh大亨堡是不是小七的最好吃,你信不信啊?";
string pattern("(会不会|是不是|能不能|信不信)");
regex r(pattern); //regex 表示一个正则表达式类
(1)输出一个字符序列和一个正则表达式的匹配结果
cout << regex_match(str, results, r) << endl; //输出结果为:0
if (regex_match(str, results, r))
{
cout<<results[0]<<endl;
}
(2)regex::icase表示匹配时忽略大小写
cout<<regex_match("aaaAAA", regex("a*", regex::icase)) << endl; //结果为1
cout << regex_match("aaaAAA", regex("a*")) << endl; //结果为0
(1)输出第一个与正则表达式匹配的子序列结果
cout << regex_search(str, results, r) << endl; //输出结果为1
if (regex_search(str, results, r))
{
cout << results[0] << endl; //输出结果为:是不是
cout << results.str() << endl; //result[]与result.str()这两种方式能够获得相同的值
}
(2)利用迭代器访问到所有匹配的结果值
string::const_iterator iterStart = str.begin(); //迭代器声明
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart,iterEnd,results,r))
{
temp = results[0];
cout << temp << endl;
iterStart = results[0].second; //更新搜索起始位置,搜索剩下的字符串
}
输出结果为:是不是,信不信
(1)字符串替换匹配
cout << regex_replace(str, r, "hello") << endl;
输出结果为:2019年12月看的电视hhhhh大亨堡hello小七的最好吃,你hello啊?
(2)使用regex_replace()函数调整字符串的内容和顺序
string str2 = "Hello_2019!";
regex r2("(.{3})(.{2})_(\\d{4})!"); //匹配3个任意字符+2个任意字符+下划线+4个数字+!
cout << regex_replace(str2, r2, "$1$3") << endl; //输出:Hel2019,将字符串替换为第一个和第三个表达式匹配的内容
cout << regex_replace(str2, r2, "$1$3$2") << endl; //输出:Hel2019lo,交换位置顺序
//利用sregex_iterator迭代器.它将反复调用regex_search()来寻找文件中的所有匹配
for (sregex_iterator it(str.begin(), str.end(), r), end_it; it != end_it; ++it)
{
cout << it->str() << endl;
}
输出结果为:是不是,信不信
//C++正则表达式接口类设计
class RegularEX
{
public:
//将一个字符序列和一个正则表达式匹配
int re_match(string str)
{
return regex_match(str,results,regex(pattern1));
}
//寻找第一个与正则表达式匹配的子序列
int re_search(string str)
{
return regex_search(str, results, regex(pattern1));
}
//替换匹配
string re_replace(string str)
{
return regex_replace(str, regex(pattern1), pattern2);
}
//输入正则表达式pattern
void get_pattern1(string pat) //匹配pattern
{
pattern1 = pat;
}
void get_pattern2(string pat) //替换pattern
{
pattern2 = pat;
}
private:
smatch results; //容器类,保存在string中搜索的结果
string pattern1,pattern2;
};
int main()
{
string str = "2019年12月看的电视hhhhh大亨堡是不是小七的最好吃,你信不信啊?";
string pattern1("(会不会|是不是|能不能|信不信)");
string pattern2("Asia-Lee");
RegularEX re_ex; //声明一个正则类对象
re_ex.get_pattern1(pattern1); //获取pattern1
re_ex.get_pattern2(pattern2); //获取pattern2,为替换字符串
cout << re_ex.re_match(str) << endl; //结果为:0
cout << re_ex.re_search(str) << endl; //结果为:1
cout << re_ex.re_replace(str) << endl; //结果为:2019年12月看的电视hhhhh大亨堡Asia-Lee小七的最好吃,你Asia-Lee啊?
return 0;
}
详细正则表达式规则可参看:正则表达式规则