字符组 []
[Pp]ython
就可以匹配到Python python 也就是开头是P或者p 后面接ython的字符串
[0-9]
就是可以匹配到0-9之间的所有数字 但是只匹配一个
[0-9a-zA-Z]
就是匹配所有的数字 小写字母 大写字母 只匹配一个
[a-zA-Z0-9]+ (表示英文包括大小写数字全匹配)
^
中括号中的^表示非
[^0-9]
表示不会匹配0-9
直接写的^表示精确查询
^ab$
表示必须以ab结尾
[^0-9]+
或者[^0-9]*
用来匹配换行符
汉字
[\u4e00-\u9fa5]表示汉字范围在这个范围内的汉字 这是utf-8编码
regex_match(s,regex("[\ue400-\u9fa5]+"));//可以匹配"你好"
+
表示一个或多个
[\d]+ 就可以匹配143252 只有[\d]就只能匹配其中一个数字
*
表示匹配0个或多个
. 可以匹配任何东西 除了\n
.*
一般用来匹配一堆东西
a.*b
将会匹配最长的以a开始,以b结束的字符串
[/-]
通过转译字符匹配‘-’ 等特殊字符
|
想匹配多个特殊字符时
例如[\[|\]|\-|\(|\)]
匹配-----()[] 通过|来进行分割
也可以表示 或
([abcd|1234])表示可以匹配abcd或者1234
$
$ 表示结尾 ab$ 表示必须以ab结尾
python$
表示在结尾处匹配python 并且不能加特殊符号包括空格
下面这些小写字母换成大写字母就是非的意思
[\d]
表示全部数字 [\D]表示不匹配数字
[\w]
表示数字 大小写字母都可以被匹配 但是只匹配一个
[\s]
表示匹配空格
[\bwoaini\b]
表示单词边界 只会匹配单词和空格之间的 也就匹配这个单词woaini 如果跟了其他字母数字就不行了 特殊符号可以
不加[] 直接写^python
表示匹配字符串开头的 python 后面如果又出现了python就不会再匹配了 比如 python123python他就只能匹配到前面那段python
?
?n
表示这个n可以出现也可以不出现
{}
{3}表示重复次数3
比如\d{3}-\d{5}
{3,4}表示可以匹配3个也可以匹配4个 如果是{3,}表示匹配3个以上的数字
例如
+等价于{1,}
*等价于{0,}
<>
<.+> (默认贪婪匹配任意字符)
<.+?> (默认懒惰匹配任意字符)
提取
(\d{4})-(\d{7})这样就可以提取相应的数据了
regex_match 全文匹配
match是全文匹配,即要求整个字符串符合匹配规则。
cout << regex_match("123", regex("\\d")) << endl; //结果为0. \\是为了转义 \
cout << regex_match("123", regex("\\d+")) << endl; //结果为1
regex_search 搜索匹配
regex_search(匹配字符串,获取结果,匹配规则)
regex_search(起始位置,终止位置,获取结果,匹配规则)// 起始位置和终止位置是目标字符串的迭代器
字符串中存在符合规则的子字符串
string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}"); //匹配四个数字
//迭代器声明
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
temp = result[0];
cout << temp << " ";
iterStart = result[0].second; //更新搜索起始位置,搜索剩下的字符串
}
//输出结果:2018 2017
cmatch 存储结果
string str = "Hello_2018";
smatch result;
regex pattern("(.{5})_(\\d{4})"); //匹配5个任意单字符 + 下划线 + 4个数字
//主要是通过()决定是第几组
if (regex_match(str, result, pattern))
{
cout << result[0] << endl; //完整匹配结果,Hello_2018
cout << result[1] << endl; //第一组匹配的数据,Hello
cout << result[2] << endl; //第二组匹配的数据,2018
cout<< result.str() << endl; //完整结果,Hello_2018
cout<< result.str(1) << endl; //第一组匹配的数据,Hello
cout << result.str(2) << endl; //第二组匹配的数据,2018
}