使用正則表達式提取HTTP元素
- 1.正則表達式
- 2.正則庫的使用
- 3.使用正則表達式提取HTTP請求行
1.正則表達式
正則表達式它其實是描述了一種字符串匹配的模式,它可以用來在一個字符串中檢測一個特定格式的字串,以及可以將符合特定規則的字串進行替換或者提取的功能。
2.正則庫的使用
bool std:regex_match (const std:string &src, std:smatch &matches, std:regex &e)
1.src表示要匹配的原始字符串
2.matches,匹配提取的子串會放入這里,類似一個數組
3.e:正則表達式的匹配規則
4.返回值:用于確定匹配是否成功
3.使用正則表達式提取HTTP請求行
#include <iostream>
#include<regex>
#include <string>
int main()
{std::string str="GET /qq.com/login?user=tew&paswwd=123 HTTP/1.1\r\n";std::smatch matches;//匹配規則std::regex e("(GET|POST|PUT) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");//()表示要提取的子串//.是匹配除\n和\r之外的任何單個字符。//*表示匹配0次或多次//_([^?*])表示以空格開始,匹配并提取非問號的字符,*表示匹配0次或多次//\\?(.*)_表示以?開始,匹配?后面字符0次或多次,以空格為結尾 //_(HTTP/1\\.[01]) 表示以空格開始,提取HTTP1. 0或1的字符//(?: )? 這個是匹配某個字符串但不提取,最后?表示匹配前面表達式0次或1次//中間的?user=tew&paswwd=123不是所有的http請求都有,所以有就提取沒有就不提取//(?:\\?(.*))? 如果有就執行\\?(.*),如果沒有就算bool ret=std::regex_match(str,matches,e);if(ret==false)return -1;for(auto &it:matches){std::cout<<it<<std::endl;}return 0;}