正则表达式(c++)(施工中)

  

先来看一个例子,要求写一段代码,实现如下功能:

从标准输入中读取一行字符串,从中读取所有邮箱的格式;


对于这个问题,用传统的方式是可以解决的:

我们可以用解析字符串的方式实现,需要遍历一遍获取的字符串,读取其中关键的几个字符”。”“@”“。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++)(施工中)