目录
正则库的简单概述
注意正则表达式的相关函数要在gcc版本较高的版本下才能正常运行,否则会出现编译成功,但是运行失败的情况
regex_match - C++ Reference (cplusplus.com)
关于元字符的描述可以参考下面的文章
简单的测试代码
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string str = "/numbers/1234";
//匹配以 /numbers/起始,后面跟了一个或者多个数字字符的字符串,并且在匹配的过程中提取这个匹配到的数字字符串
std::regex e("/numbers/(\\d+)");
std::smatch matches;
bool ret = std::regex_match(str, matches, e);
if(ret == false)
{
return -1;
}
for(auto &s : matches)
{
std::cout << s << std::endl;
}
return 0;
}
其中smatch我们可以把它理解为一个数组用来存放提取出来的数据
运行结果如下
用正则表达式提取HTTP格式的字符串
#include <iostream>
#include <string>
#include <regex>
int main()
{
//HTTP请求行格式:GET /qingfeng/login?user=xiaoming&pass=123123 HTTP/1.1\r\n
std::string str = "GET /qingfeng/login?user=xiaoming&pass=123123 HTTP/1.1\r\n";
std::smatch matches;
// 请求方法的匹配 GET HEAD POST PUT DELETE
std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
// GET|HEAD|POST|PUT|DELETE 表示匹配并提取其中任意一个字符串
// [^?]* [^?]匹配非问号字符,后边的*表示0次或者多次
// \\?(.*) \\?表示原始的 ? 字符 (.*)表示提取?之后的任意字符0次或者多次,直到遇到空格
// HTTP/1\\.[01] 表示匹配以HTTP/1.开始,后边有个0或1的字符串
// (?:\n|\r\n)? (?: ...)表示匹配某个格式字符串,但是不提取, 最后的 ? 表示匹配前边的表达式0次或者1次
bool ret = std::regex_match(str, matches, e);
if(ret == false)
{
return -1;
}
for(auto &s : matches)
{
std::cout << s << std::endl;
}
return 0;
}
运行结果
可以看出符合预期提取