目录
参考
regex可以很简单 也可以很复杂
/* 限定符 修饰前面的一个字符,可以是元字符
* 重复0次或更多次
+ 重复1次或更多次 []里的+就只是一个"+"字符了
? 重复0或1次
{n} 重复n次
{n,} 重复n或更多次
{n,m} 重复n到m次
例:abc* 表示可匹配 以ab 开头后面没有c或有多个c
\d{5} 表示\d匹配到的数字连续出现5次
元字符 匹配单个字符
. 匹配除换行符以外的任意单个字符
^ 表示匹配行首的文本(以什么表达式开始)
$ 表示匹配行尾的文本(以什么表达式结束)
\s 匹配任意的空白
\S 匹配任意不是空白符的字符
\d 匹配数字
\D 匹配任意非数字的字符
\w 匹配字母或数字或下划线
\W 匹配不是字母数字下划线的字符
\b 匹配一个单词边界 所谓'单词边界' 请参考https://blog.csdn.net/weixin_42636353/article/details/82466892
\B 非字边界匹配。
其他
[] 匹配其中的任意一个字符 相当于或的意思 [abcd]
[^] 匹配除了方括号内的字符 相当于取反 [^abcd]
[n-m] 匹配n到m范围内的任意 一个字符 [0-9] 这是\d的全写 [^0-9] 这是\D的全写 可和其她范围连用 [0-9A-z_]
\ 转义符 转特殊字符为要匹配的字符 \. 匹配. \\ 匹配\ \/ 匹配/
| 前面一大部分或者后面一大部分 如果要改变范围可用() 如 b(o|a)y 匹配boy bay
[\u4e00-\u9fa5] 匹配汉字
正则表达式还有很多还有待深究
捕获组
- (组) 这个分组
// 原始字符串,由 '|' 分隔
std::string s = "part1|part2|part3";
// 正则表达式模式,匹配由 '|' 分隔的第二部分
// 我们使用捕获组来保留前后部分
std::regex pattern("(\\w+)\\|(\\w+)\\|(\\w+)");
// 替换字符串,捕获到的用replacement的内容替换 下面这是种拼接
std::string replacement = "$1|new_part|$3";
// 使用正则表达式进行替换
std::string result = std::regex_replace(s, pattern, replacement);
// 输出替换后的字符串
std::cout << result << std::endl;
输出:
part1|new_part|part3
// 原始字符串
std::string s = "The quick brown fox jumps over the lazy dog dog";
// 正则表达式,匹配重复的单词
std::regex e("(\\b\\w+)\\s+\\1\\b");
// 替换字符串,其中\\1是一个反向引用,引用了第一个捕获组
std::string r = "$1"; // 只保留第一个匹配的单词 或者"555"替换 上面的 重复的dog
// 执行替换
std::string result = std::regex_replace(s, e, r);
// 输出结果
std::cout << result << std::endl;
输出:
The quick brown fox jumps over the lazy dog
反向引用 与 提取数据
- 上面$1 (这里1是组号 表示第一个组) 就是提取匹配组匹配到的数据
std::string s = "I have an apple apple2."; std::regex e(R"((apple)\s+(apple2))"); std::string r = R"($2 orange1)"; // 使用$1引用第一个捕获组,即第一个"apple" std::string result = std::regex_replace(s, e, r); // 结果将是 "I have an apple orange." std::cout<<result<<std::endl;
>.R"()"是CLion编译器提供支持的被其修的字面字符量不需要手动转义转义字符的写法
输出:I have an apple2 orange1.
- 反向引用
假设你想在一个字符串中查找连续重复的单词,如"the the"或"is is"。你可以使用以下正则表达式
上面的 \1 就是反向引用第一组的内容std::regex e("(\\b\\w+)\\s+\\1\\b");