正则表达式

  • 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