正则表达式 (C++) (施工中)
先来看一个例子,要求写一段代码,实现如下功能:
从标准输入中读取一行字符串, 从中读取所有邮箱的格式;
对于这个问题,用传统的方式是可以解决的:
我们可以用解析字符串的方式实现,需要遍历一遍获取的字符串,读取其中关键的几个字符 “.” "@" ".com" 和其中的相关顺序;
C++11支持正则表达式,利用它可以避免重复造轮子;
代码:
#include<iostream>#include<string>#include<regex>intmain(){std::stringline;std::regexemail(R"(\w+@(\w+\.)+\w+)");while(getline(std::cin,line)){std::smatchmatches;autocurrent=cbegin(line);autolast=cend(line);while(current!=last){if(regex_search(current,last,matches,email)){std::ssub_matchmatch=matches[0];current=match.second;std::cout<<"["<<match.str()<<"]"<<std::endl;
}else{break;}}}}
——————————————————————
正文:
一、正则表达式介绍
正则表达式(regular expression) 是一种描述字符序列的方法,是一种极其强大的计算工具。C++11中新增了这一特性,在 C++正则表达式库(RE库)中。
PS:RE库,定义在头文件 "regex"内,命名空间:std;
正则表达式组件:
regex: 表示有一个正则表达式的类;
regex_match: 将一个字符序列与一个正则表达式匹配;
regex_search : 寻找第一个与正则表达式匹配的子序列;
regex_replace: 使用给定格式替换一个正则表达式;
sregex_iterator : 迭代器适配器,调用regex_search 来遍历一个string中所有匹配的子串;
smatch : 容器类,保存在string中搜索的结果;
ssub_match : string中匹配的子表达式的结果;
接下来简单介绍几个常用的组件:
regex类:
表示一个正则表达式。除了初始化和赋值操作,还支持其他的一些操作(后面介绍);
regex_match方法:
确定一个给定字符序列与一个给定regex对象是否完全匹配,返回true/false,如果匹配到,将匹配到的内容保存起来;
segex_search方法:
确定一个给定字符序列与一个给定regex对象是否匹配,只要有部分匹配,就返回true,如果匹配到,将匹配到的部分保存起来;
以上两个方法均有2个重载版本,分别为:
(seq,m,r,mft)(seq,r,mft)/*seq:待查找的字符串序列,可以是一个std::string,或表示范围的一对迭代器,或一个指向空字符结尾的字符数组的指针m:smatch对象,用来保存匹配结果的相关细节r:regex对象,匹配的类型mft:(可选)regex_constants::match_flag_type类型,它们会影响匹配过程(后述)*/
二、使用RE库
从上面那几个组件的介绍,我们得知:
1、regex类型的对象就是存放要匹配字符串的指定格式,而这个格式就是所谓的"正则表达式"了。
默认的正则表达式语言是 ECMAScript,接下来介绍一些常用的ECMAScript语法
1.1、模式[[::alpha:]]
匹配任意字母
1.2、符号 "+"
一个或多个,比如 "[[::alpha:]]+" 表示希望匹配一个或多个字母
1.3、符号"*"
零个或多个,比如 "[[::alpha:]]+" 表示希望匹配零个或多个字母
2、smatch类型的对象,用来保存所匹配到的字符串1
接下来做一个小练习:
有一个英文单词的拼写规则:"i除非排在c之后,否则必须在e之前";
比如: "freind"、"theif"就不符合这一拼写规范,而"recepit" "receive"则符合;
现在要求写一个程序,从标准输入中读取一行字符串,找出这些不符合规则的英文单词。
代码:
//查找不在字符c之后的字符串eiintmain(){std::stringpattern("[^c]ei");/*“[^c]”:希望匹配不是c的字符"[^c]ei":想要匹配的上述字符后接ei的字符串*///需要包含pattern的整个单词pattern="[[:alpha:]]*"+pattern+"[[:alpha:]]*";/*前后追加"[[:alpha:]]*"表示:与"[^c]ei"模式匹配的完整字符串*/std::regexr(pattern);//构造一个用于查找模式的regexstd::smatchresults;//定义一个对象保存搜索结果//定义一个string保存与模式匹配的文本,以及不匹配的文本std::stringtest_str;while(getline(std::cin,test_str)){//用r在test_str中查找与pattern匹配的子串if(regex_search(test_str,results,r)){std::ssub_matchresult=results[0];std::stringret_str="["+results.str()+"]";std::cout<<ret_str<<std::endl;}}return0;}
_________________________________________________________
指定regex对象的选项:
当我们定义一个regex对象,或对一个regex对象调用assign为其赋予新值时,可以指定一些标志来影响regex如何操作
regex
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。