文章目录
- 一、具有特殊意义的元字符
- 二、正则库的使用
- 1、字符串匹配
- 2、字符串捕获
- 3、字符串替换
#include<regex>
// 用来匹配(进而捕获、替换)字符串。 --- 处理字符串
一、具有特殊意义的元字符
符号 | 意义 |
---|---|
^ | 匹配行的开头,也有否定(例如:[^a-z]:匹配的是非a-z的元素) |
$ | 匹配行的结尾 |
. | 匹配任意单个字符 |
[…] | 匹配[]中的任意一个字符,例如[a-z]:匹配a-z中的任意元素 |
(…) | 设定分组 |
\ | 转义字符 |
\d | 匹配数字[0-9] |
\D | \d 取反 |
\w | 匹配字母[a-z],数字,下划线 |
\W | \w 取反 |
\s | 匹配空白符(空格、制表符、换页符) |
\S | \s 取反 |
| | 逻辑或 |
* | 前面的元素重复任意次 |
? | 前面的元素重复0次或1次 |
+ | 前面的元素重复1次或多次 |
{n} | 前面的元素重复n次 |
{n,} | 前面的元素重复至少n次 |
{n,m} | 前面的元素重复至少n次,至多m次 |
** 所有含\的元字符,在C++定义的时候都需要写成\\ **
二、正则库的使用
1、字符串匹配
bool regex_match(const char* str, regex reg);
// 满足正则标准返回true,不满足返回false
细节问题:
完全匹配问题,必须所有的正则规则都满足才满足,默认是区分大小写的。(可以设置成不区分大小写)
/******************** 区分大小写的正则匹配 ********************/ string str = "iLoveyou1234"; regex reg("[a-z0-9]+"); // 匹配最小1次的 a-z或则0-9 ret = regex_match(str, reg); // 这里的ret等于false,因为str中有大写,而正则表达式是小写匹配的/******************** 不区分大小写的正则匹配 ********************/ string str = "iLoveyou1234"; regex reg("[a-z0-9]+", regex::icase); // 匹配最小1次的 a-z或则0-9, 不区分大小写 ret = regex_match(str, reg); // 这里的ret等于true
单斜杠(‘\’)要改成双斜杠
2、字符串捕获
std::smatch matches;
bool regex_match(const char* str, matches, regex reg);
// 将匹配的结果放到matches中,以()进行分组/* 第一次捕获字符串的前缀和后缀 */
matches.prefix();// 匹配当前字符串的前缀
matches.suffix();// 匹配当前字符串的后缀
/* 捕获后续满足的字符串--- 通过迭代器进行遍历smatches */
sregex_iterator pos(string.begin(), string.end(), regex);
/* 把每一部分都得到 */
sregex_token_iterator(string.begin(), string.end(), regex, flag);
// flag: 0 所有匹配到的
// flag: -1 存储所有的不匹配的
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{ string str = "iloveyou1234";smatch matches;regex reg("[a-z0-9]+");regex_match(str, matches, reg);// 得到所有的匹配到的部分(按照()进行分组)for (auto& e : matches){cout << e << endl;}return 0;
}// 输出:iloveyou1234
3、字符串替换
string regex_replace(string str, regex reg, string replace_string);
// 将匹配成功的字符串替换成replace_string