正则表达式
- C++11 的
中使用正则表达式时,需要在字符串字面量中对反斜杠 \ 进行转义,也就是写成双反斜杠 \ - C++编译器会先处理字符串字面量的转义字符,而正则表达式引擎是后处理的。
例如你写 \d+,编译器会把 \d 视为未知转义字符报错或变成 d,正确写法 \d+,编译器先把 \ 转为 \,正则引擎再读到 \d。
- 如在匹配 .html 时 . 可以使用 \. 或者 [.]
using namespace std;
int main()
{
char buf[] = "GET /www/index.html HTTP/1.1";
string src = buf;
//string pattern = "(^[A-Z]+) (.+([.][a-zA-z]+)?) ";
string pattern = "(^[A-Z]+) (.+(\\.[a-zA-z]+)?) ";
regex r(pattern);
smatch sma;
regex_search(src,sma,r);
string a = sma[1];
string b = sma[2];
string c = sma[3];
printf("%s\n, %s\n %s\n", a.c_str(), b.c_str(),c.c_str());
getchar();
return 0;
}
输出:
a= "GET" b= "/www/index.html" c= ".html"
正则表达式中的懒匹配
特性:
- 贪婪模式 (默认)
- 懒惰模式 (非贪婪)
- 写法区别
- 量词后面
- 不加任何符号 加 ? . vs .?
- 匹配原则 尽可能多地匹配 尽可能少地匹配(够用就好) -
- 常见量词 + ? {n,m} ? +? ?? {n,m}? 加个 ? 就变懒
- 实际效果 通常吃到最后一个结束符 吃到最近的第一个结束符 非常直观
如:字符串 {\"username-123\":\"messi\",\"age\":39}
正则表达式 "\"[\"]" 匹配 username-123