目录
1.正则表达式库概述
2.主类
①类basic_regex
②类sub_match
③类match_results
3.算法
①regex_match
②regex_search
③regex_replace
4.迭代器
①regex_iterator
②regex_token_iterator
1.正则表达式库概述 ^
正则表达式是一种用于在字符串中匹配模式的微型语言。
2.主类 ^
这些类封装正则表达式和在字符的目标序列中匹配正则表达式的结果。
①类basic_regex ^
类模板 basic_regex提供保有正则表达式的通用框架。其中常用的特化为regex和wregex。
类定义
//定义于头文件 <regex>
class regex : public basic_regex
{
public:
//构造函数:
regex();
//复制构造函数,拷贝构造函数
regex(const basic_regex&);
regex(basic_regex&&)noexcept;
//范围构造函数
regex(iterator first, iterator last, flag_type f = std::regex_constants::ECMAScript);
//C风格字符串构造函数
explicit regex(const char*, flag_type f = std::regex_constants::ECMAScript);
regex(const char*,size_t, flag_type f = std::regex_constants::ECMAScript);
//字符串构造函数
explicit regex(const string, flag_type f = std::regex_constants::ECMAScript);
// initializer_list构造函数
regex(std::initializer_list<CharT> init, flag_type f = std::regex_constants::ECMAScript);
~regex();
//等同于构造函数
regex& assign(与构造函数参数相同)
//返回正则表达式内有标记的子表达式数
unsigned int mark_count() const;
//返回构造函数或最后一次到 assign() 调用中设置的正则表达式语法标志
flag_type reg2.flags();
//获取本地环境信息
locale_type getloc() const;
//设置本地环境信息
locale_type imbue();
//交换内容
void swap(regex&);
}
②类sub_match ^
类模板sub_match表示有标记子表达式所匹配的字符序列,继承自pair。其中常用的特化为csub_match,wcsub_match,ssub_match和wssub_match。
类定义
class csub_match :public sub_match
{
csub_match();
//指示此匹配是否成功,数据成员,非函数
bool matched;
//匹配序列的开始
const char* first;
//匹配序列的结尾后一位置
const char* second;
//若存在则返回匹配的长度
__int64 length() const;
//转换为底层字符串类型
string_type str() const;
//若存在则比较匹配的子序列
int compare(const char*) const;
}
③类match_results ^
类模板 match_results 保有表示正则表达式匹配结果的字符序列汇集,其中常用的特化为:cmatch,wcmatch,smatch,wsmatch。
类定义
class cmatch : public match_results
{
public:
//构造函数
cmatch();
explicit cmatch(const Allocator&);
~cmatch();
//返回关联的分配器
get_allocator()
//检查结果是否合法
ready()
//检查匹配是否成功
empty()
//返回完全建立的结果状态中的匹配数
size()
//返回子匹配的最大可能数量
max_size()
//返回特定子匹配的长度
length()
//返回特定子匹配首字符的位置
position()
//返回特定子匹配的字符序列
str()
//返回目标序列起始和完整匹配起始之间的子序列
prefix();
//返回完整匹配结尾和目标序列结尾之间的子序列
suffix();
//返回指向子匹配列表起始的迭代器
begin();
cbegin();
//返回指向子匹配列表末尾的迭代器
end();
cend();
//为输出格式化匹配结果
format();
swap();
}
3.算法 ^
①regex_match ^
试图匹配正则表达式到整个字符序列
//确定正则表达式是否匹配整个目标字符序列(string,C字符串或迭代器对表示)
//确定正则表达式和整个目标字符序列是否有匹配,如果有,匹配结果返回于match_results对象
//迭代器对
bool regex_match(iterator first , iterator second , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//C字符串
bool regex_match(const char* , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//字符串
bool regex_match(const string& , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//不返回match_results对象版本
//迭代器对
bool regex_match(iterator first , iterator second , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default)
//C字符串
bool regex_match(const char* , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//字符串
bool regex_match(const string& , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
例子:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str[]{ "first.txt","second.txt","abc.exe","asd.cpp" };
regex reg("([a-z]+)\\.txt");
smatch smat;
for (const auto& s : str)
cout << s << ":" << regex_match(s, smat, reg) << endl;
for (const auto& s : str)
{
if (regex_match(s, smat, reg))
{
cout << "匹配:" << smat.str() << endl;
cout << "字符串长度:" << smat.length() << endl;
cout << "子匹配个数:" << smat.size() << endl;
cout << endl;
}
}
}
注:regex_match只考虑完全匹配。
②regex_search ^
试图匹配正则表达式到字符序列的任何部分
//确定正则表达式是否匹配整个目标字符序列(string,C字符串或迭代器对表示)
//确定正则表达式和整个目标字符序列是否有匹配,如果有,匹配结果返回于match_results对象
//迭代器对
bool regex_search(iterator first , iterator second , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//C字符串
bool regex_search(const char* , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//字符串
bool regex_search(const string& , match_results , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//不返回match_results对象版本
//迭代器对
bool regex_search(iterator first , iterator second , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default)
//C字符串
bool regex_search(const char* , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
//字符串
bool regex_search(const string& , basic_regex , regex_constants::match_flag_type flags=regex_constants::match_default);
例子:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
regex reg("hello|helloWorld");
cmatch smat;
if (regex_match("helloWorld", smat, reg))
cout << "匹配:" << smat.str() << endl;
else
cout << "不匹配" << endl;
if (regex_search("helloWorld", smat, reg))
cout << "匹配:" << smat.str() << endl;
else
cout << "不匹配" << endl;
if (regex_match("helloWorlds", smat, reg))
cout << "匹配:" << smat.str() << endl;
else
cout << "不匹配" << endl;
if (regex_search("helloWorlds", smat, reg))
cout << "匹配:" << smat.str() << endl;
else
cout << "不匹配" << endl;
//regex_search只需要包含目标字符序列,而regex_match则是需要完全匹配目标字符序列
//输出:
//匹配:helloWorld
//匹配:hello
//不匹配
//匹配:hello
}
③regex_replace ^
以格式化的替换文本来替换正则表达式匹配的出现位置
//第一个参数为输出迭代器,倒数第二个参数为替换目标字符序列的字符
outiterator regex_replace(outiterator , iterator first , iterator second ,basic_regex , const string , regex_constants::match_flag_type flags =regex_constants::match_default);
outiterator regex_replace(outiterator , iterator first , iterator second ,basic_regex , const char* , regex_constants::match_flag_type flags =regex_constants::match_default);
//返回一个字符串,倒数第二个参数为替换目标字符序列的字符
string regex_replace(const string , basic_regex , const string , regex_constants::match_flag_type flags =regex_constants::match_default);
string regex_replace(const char* , basic_regex , const string , regex_constants::match_flag_type flags =regex_constants::match_default);
string regex_replace(const char* , basic_regex , const char* , regex_constants::match_flag_type flags =regex_constants::match_default);
例子:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str{ "hello 28 world 35 nihaoa 89" };
regex reg("[1-9]");
cout << regex_replace(str, reg, "A") << endl;
//写结果到输出迭代器上
regex_replace(ostreambuf_iterator<char>(cout),str.begin(),str.end(), reg, "[$&]");
}
注:regex_replace参数中并没有用到match_results
4.迭代器 ^
①regex_iterator ^
regex_iterator 是访问底层字符序列中正则表达式的单独匹配的只读向前迭代器
#include <iostream>
#include <regex>
#include <string>
using namespace std;
//有参构造函数返回一个指向序列首的迭代器,默认构造函数返回一个指向序列尾的迭代器
//对迭代器解引用返回一个match_results对象
//sregex_iterator sregex_iterator(string::const_iterator first , string::const_iterator second , regex , regex_constants::match_flag_type flags =regex_constants::match_default)
int main()
{
string str{ "hello 28 world 35 nihaoa 89" };
regex reg("[1-9]");
smatch smat;
auto iter = sregex_iterator(str.begin(), str.end(), reg);
auto iter_end = sregex_iterator();
cout <<"数字的数量:"<< distance(iter, iter_end) << endl;
cout << "分别为:" << endl;
while (iter != iter_end)
{
smat = *iter;
++iter;
cout << smat.str() << endl;
}
}
②regex_token_iterator ^
regex_token_iterator通过在给定的字符串中所有正则表达式匹配中的指定子表达式,或通过不匹配的子串迭代
#include <iostream>
#include <regex>
#include <string>
#include <vector>
using namespace std;
//submatch默认为0,表示完整匹配,submatch为-1时,表示未匹配部分,其他值都行为未定义
//第四个参数也可以为容器,同时包括0和-1
regex_token_iterator(iterator first , iterator second , regex , int submatch=0 , regex_constants::match_flag_type m=regex_constants::match_default );
int main()
{
string str{ "hello 28 world 35 nihaoa 89" };
regex reg("[1-9]");
smatch smat;
vector<int> ivec{ -1,0 };
cout << "输出完整匹配的字符:" << endl;
auto iter1 = sregex_token_iterator(str.begin(), str.end(), reg, 0);
auto iter_end1 = sregex_token_iterator();
while (iter1 != iter_end1)
cout << *iter1++ << " ";
cout << endl << "输出未匹配的部分:" << endl;
auto iter2 = sregex_token_iterator(str.begin(), str.end(), reg, -2);
auto iter_end2 = sregex_token_iterator();
while (iter2 != iter_end2)
cout << *iter2++ << " ";
cout << endl << "输出全部:" << endl;
auto iter3 = sregex_token_iterator(str.begin(), str.end(), reg, ivec);
auto iter_end3 = sregex_token_iterator();
while (iter3 != iter_end3)
cout << *iter3++ << " ";
}