c++正则表达式

1. 转义字符

在讲c++正则的时候,首先要讲一下,这个转义字符,在c++中匹配正则的时候,正则是需要对其中的’'进行转义的。

cout << regex_match("123", regex("\d+")) << endl;   //结果为0,需要转义字符'\'
cout << regex_match("123", regex("\\d+")) << endl;  //结果为1,完全匹配

2.匹配方法

在c++11中提供了三种匹配正则的方法,分别为:regex_match(一般用来校验字符串是否满足正则要求),regex_search(一般用来搜索字符串中满足正则要求的字符串),regex_replace(一般用来替换字符串中满足正则要求的字符串)
简单示例,从字符串中获得realm和nonce的值

#include <string>
#include <iostream>
#include <regex>
using namespace std;
   
int main()
{
	string str = "WWW - Authenticate:Digest realm = \"HipcamRealServer\", nonce = \"3b27a446bfa49b0c48c3edb83139543d\"";
	regex pattern("\\brealm = \"(\\w*)\".*\\bnonce = \"(\\w*)\"");
	
	smatch result;
	if (regex_search(str, result, pattern))
	{
		cout << "正则结果为 :" << endl;
		for (auto& i : result)
		{
			cout << i << endl;
		}
		//两个小括号之间的子表达式的值会被捕获,总表达式匹配结果序号为0
		cout << "realm = " << result[1] << endl;
		cout << "nonce = " << result[2] << endl;
	}  
    return 0;
}

3.正则表达式的基本概念

  • 3.1
    元字符

    • 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
    • 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
      ? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
      \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。
      例如,‘n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\’ 匹配 “” 而 “(” 则匹配 “(”。
      ^ 匹配输入字符串的开始位置。如果设置了 regexp 对象的 multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
      $ 匹配输入字符串的结束位置。如果设置了regexp 对象的 multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
      . 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.|\n)"的模式。
      \d 匹配一个数字字符。等价于 [0-9]。
      \d 匹配一个非数字字符。等价于 [^0-9]。
      \w 匹配字母、数字、下划线。等价于’[a-za-z0-9_]’。
      \w 匹配非字母、数字、下划线。等价于 ‘[^a-za-z0-9_]’
      *、 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
  • 限定符

用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

  • 定位符

用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。

  • 3.2 小括号表达式
  • 正则表达式中的小括号的作用是对字符进行分组,并保存匹配的文本。与位于小括号之间的模式匹配的内容都会被捕获
  • 3.3 中括号表达式
  • 中括号就是匹配括号内的其中一个的范围
  • 3.4 大括号表达式
  • 大括号就是匹配几次,就是重复几次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值