先来看一个例子,要求写一段代码,实现如下功能:
从标准输入中读取一行字符串,从中读取所有邮箱的格式;
对于这个问题,用传统的方式是可以解决的:
我们可以用解析字符串的方式实现,需要遍历一遍获取的字符串,读取其中关键的几个字符”。”“@”“。com”和其中的相关顺序;
c++ 11支持正则表达式,利用它可以避免重复造轮子;
代码:
# include & lt; iostream> # include & lt; string> # include & lt; regex> int main () { std:: string 线; std:: regex 电子邮件(R”(\ w + @ \ w + \。+ \ w +) "); while (, getline (std:: cin,线),) { std:: smatch 匹配; auto current =, cbegin(线); auto last =, cend(线); while (, current !=, last ) { if (regex_search(,,,,比赛,,电子邮件)) { std:: ssub_match match =,匹配[0]; 时间=current match.second; std:: cout & lt; & lt;,“[,”, & lt; & lt;, match.str (), & lt; & lt;,“,]”, & lt; & lt;, std:: endl;
}, 其他的 { 打破; } } } }
- - - - - - - - - - - - - - - - - - - - - - -
正文:
一、正则表达式介绍
正则表达式(正则表达式)是一种描述字符序列的方法,是一种极其强大的计算工具C + + 11中新增了这一特性,在c++正则表达式库(RE库)中。
PS:库,定义在头文件“正则表达式”内,命名空间:性病;
正则表达式组件:
regex ,,,,,,,:表示有一个正则表达式的类;
regex_match ,,,,:将一个字符序列与一个正则表达式匹配。
regex_search ,,,:寻找第一个与正则表达式匹配的子序列;
regex_replace ,,,:使用给定格式替换一个正则表达式;
sregex_iterator ,:迭代器适配器,调用regex_search来遍历一个字符串中所有匹配的子串,
smatch ,,,,,:容器类,保存在字符串中搜索的结果,
ssub_match ,,,,:字符串中匹配的子表达式的结果,
接下来简单介绍几个常用的组件:
regex类:
表示一个正则表达式。除了初始化和赋值操作,还支持其他的一些操作(后面介绍);
regex_match方法:
确定一个给定字符序列与一个给定正则表达式对象是否完全匹配,返回真/假,如果匹配到,将匹配到的内容保存起来。
segex_search方法:
确定一个给定字符序列与一个给定正则表达式对象是否匹配,只要有部分匹配,就返回真,如果匹配到,将匹配到的部分保存起来。
以上两个方法均有2个重载版本,分别为:
(seq,,, r,,告诉 建议(seq, r,,)/* seq: 待查找的字符串序列, 可以是一个std:: string,或表示范围的一对迭代器,或一个指向空字符结尾的字符数组的指针 m: smatch对象,用来保存匹配结果的相关细节 接待员: 正则表达式对象,匹配的类型 建议: (可选),regex_constants: match_flag_type类型,它们会影响匹配过程,(后述) */
二、使用RE库
从上面那几个组件的介绍,我们得知:
1, regex类型的对象就是存放要匹配字符串的指定格式,而这个格式就是所谓的“正则表达式”了。
默认的正则表达式语言是ECMAScript,接下来介绍一些常用的ECMAScript语法
,,,, 1.1,模式[[::α:]],
,,,,,,匹配任意字母
,,,, 1.2,符号“+”
,,,,,,一个或多个,比如“[[::α:]]+”表示希望匹配一个或多个字母
,,,, 1.3,符号“*”
,,,,,,零个或多个,比如“[[::α:]]+”表示希望匹配零个或多个字母
2, smatch类型的对象,用来保存所匹配到的字符串1
接下来做一个小练习:,
有一个英文单词的拼写规则:“我除非排在c之后,否则必须在e之前”;
比如:“朋友”,“波”就不符合这一拼写规范,而“recepit”“接收”则符合;
现在要求写一个程序,从标准输入中读取一行字符串,找出这些不符合规则的英文单词。
代码:
//,查找不在字符c之后的字符串ei int main () { std:: string 模式(“[^ c] ei”);/* “[^ c]”:,希望匹配不是c的字符 “[^ c] ei”:想要匹配的上述字符后接ei的字符串 *///,需要包含模式的整个单词 pattern =,“[[:α:]]*,+,pattern +,“[[:α:]]*”;/* 前后追加,“[[:α:]]*”,表示:与“[^ c] ei”模式匹配的完整字符串 */std:: regex r(模式);//,构造一个用于查找模式的正则表达式 std:: smatch 结果;//,定义一个对象保存搜索结果//,定义一个字符串保存与模式匹配的文本,以及不匹配的文本 std:: string test_str; while (getline (std:: cin, test_str)) {//,用r在test_str中查找与模式匹配的子串 if (regex_search (test_str,,结果,,r)) { std:: ssub_match result =,结果[0]; std:: string ret_str =,“[,”, + results.str (), +,”,)”; std:: cout & lt; & lt;, ret_str & lt; & lt;, std:: endl; } } return 0; }正则表达式(c++)(施工中)