c++ 正则表达式简单运用

#include<regex>
1. “.”: 匹配除"\n"之外的任何单个字符,若要匹配包括"\n"在内的任意字符,需使用诸如"[\s\S]"之类的模式;
 2.“^”:匹配输入字符串的开始位置,不匹配任何字符,要匹配”^”字符本身,需使用”\^”;
 3.“$”:匹配输入字符串结尾的位置,不匹配任何字符,要匹配”$”字符本身,需使用”\$”;
 4.“*”: 零次或多次匹配前面的字符或子表达式,”*”等效于”{0,}”,如”\^*b”可以匹配”b”、”^b”、”^^b”、…;
 5.“+”: 一次或多次匹配前面的字符或子表达式,等效于”{1,}”,如”a+b”可以匹配”ab”、”aab”、”aaab”、…;
 6.“?”: 零次或一次匹配前面的字符或子表达式,等效于”{0,1}”,如”a[cd]?”可以匹配”a”、”ac”、”ad”; 当此字符紧随任何其他限定符”*”、”+”、”?”、”{n}”、”{n,}”、”{n,m}”之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o";
 7.“|”:将两个匹配条件进行逻辑"或"(Or)运算,如正则表达式”(him|her)”匹配"itbelongs to him"和"it belongs to her",但是不能匹配"itbelongs to them.";
 8.“\”: 将下一字符标记为特殊字符、文本、反向引用或八进制转义符,如,”n”匹配字符”n”,”\n”匹配换行符,序列”\\”匹配”\”,”\(“匹配”(“;
 9.“\w”:匹配字母或数字或下划线,任意一个字母或数字或下划线,即A~Z,a~z,0~9,_中任意一个;
 10.“\W”:匹配任意不是字母、数字、下划线的字符;
 11.“\d”:匹配数字,任意一个数字,0~9中的任意一个,等效于”[0-9]”;
 12.“\D”:匹配任意非数字的字符,等效于”[^0-9]”;
 13. {n}”:”n”是非负整数,正好匹配n次;
 14. “{n,}”:”n”是非负整数,至少匹配n次;
 15. “{n,m}”:”n”和”m”是非负整数,其中n<=m,匹配至少n次,至多m次;
 16. [a-z]”:字符范围,匹配指定范围内的任何字符;
 17. [^a-z]”:反向范围字符,匹配不在指定的范围内的任何字符;
 18. “( )”:将”(“和”)”之间的表达式定义为”组”group,并且将匹配这个表达式的字符保存到一个临时区域,一个正则表达式中最多可以保存9个,它们可以用”\1”到”\9”的符号来引用;
 19. “(pattern)”:匹配pattern并捕获该匹配的子表达式,可以使用$0…$9属性从结果”匹配”集合提取

regex_match()算法可以用于比较一个给定源字符串和一个正则表达式模式,如果模式匹配整个源字符串,则返回true,否则返回false。

regex_search()算法可以在输入字符串中提取匹配的子字符串。smatch对象sm将包含搜索结果。如果要获得第一个捕捉组的字符串表达形式,可在代码中编写m[1]或m[1].str()。通过查看m[1].first和m[1].second迭代器可以得到这个子字符串在源字符串中出现的准确位置。

regex_iterator 逐一迭代正则查找的所有匹配成果。一般情况下,需要为某个特定的容器指定一个尾迭代器,但是对于regex_iterator,只有一个end值。只需要通过默认的构造函数声明一个regex_iterator类型,就可以获得这个尾迭代器:这个尾迭代器会被隐式地初始化为end值。

regex_iterator有助于迭代“匹配合格”的子序列。然而有时候你会想处理那些子序列之间的内容,特别是当你打算将string拆分为一个个语汇单元token或以某个东西分割string,分隔符甚至可能被指定为一个正则表达式。regex_token_iterator就提供了这样的功能。
为了将它初始化,需要传给它字符序列的起点和终点,以及一个正则表达式。此外还可以指明一列整数值,用来表示语汇化过程中的元素: 
* -1:表示你对每一个“匹配之正则表达式之间”或“语汇切分器之间”的子序列感兴趣 
* 0:表示你对每一个匹配之正则表达式或语汇切分器感兴趣 
* 任何其他数字nn:表示你对正则表达式中的第nn个匹配次表达式感兴趣

regex_replace()算法要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容。
$n	匹配第n个捕捉组的字符串。例如$l表示第一个捕捉组,$2表示第二个,依此类推
$&	匹配整个正则表达式的字符串,等同于$0
$`	在源字符串中,在匹配正则表达式的子字符串左侧的部分
$’	在源字符串中,在匹配正则表达式的子字符串右侧的部分
$$	美元符号

cmatch和smatch类分别存放char*和string类型的捕获结果,遍历即可获得。

例子:

//匹配电话号码:
string pattern = "^[0-9]{11}$";  //电话号码以数字开头数字结尾,数字出现11次
regex re(pattern);
char arr[1024] = {0};
cin.getline(arr, 1024);		
string str(arr);
bool res=regex_match(str, re);


//匹配www开头,com结尾的网址
string pattern2 = "^([w]{3})\.([A-Za-z]+)\.(com)$";   //括号会把匹配的字串提取出来并保存
regex re(pattern2);
smatch mas;  //mas就是用来保存提取出来的字串,第0个元素是整个字串,后面的才是提取的部分字串
cin.getline(arr, 1024);		
string str(arr);
cout << regex_match(str, re) << endl;
regex_search(str,mas,re);
cout << mas[0] << " " << mas[1] << " " << mas[2] <<"  "<<mas[3]<< endl;
//mas[0]保存整个字串
//mas[1]保存第一个字串,即www
//mas[2]保存第二个字串,即网址中间部分
//mas[3]保存第三个字串,即com

猜你喜欢

转载自blog.csdn.net/ywh15387127537/article/details/88787254
今日推荐