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

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

创新互联公司自2013年创立以来,是专业互联网技术服务公司,拥有项目成都做网站、成都网站建设、成都外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元姚安做网站,已为上家服务,为姚安各地企业和个人服务,联系电话:028-86922220

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

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

我们可以用解析字符串的方式实现,需要遍历一遍获取的字符串,读取其中关键的几个字符 “.” "@" ".com" 和其中的相关顺序;

C++11支持正则表达式,利用它可以避免重复造轮子;

代码:

#include <iostream>
#include <string>
#include <regex>

int main()
{
	std::string line;
	std::regex email(R"(\w+@(\w+\.)+\w+)");	
	while ( getline(std::cin, line) )
	{
		std::smatch matches;
		auto current = cbegin(line);
		auto last = cend(line);
		while ( current != last )
		{
			if (regex_search(current, last, matches, email))
			{
				std::ssub_match match = 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之后的字符串ei
int main()
{
	std::string pattern("[^c]ei");
	/*
	“[^c]”	: 希望匹配不是c的字符
	"[^c]ei"	:想要匹配的上述字符后接ei的字符串
	*/

	// 需要包含pattern的整个单词
	pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";
	/*
	前后追加 "[[:alpha:]]*" 表示:与"[^c]ei"模式匹配的完整字符串
	*/

	std::regex r(pattern);	// 构造一个用于查找模式的regex
	std::smatch results;	// 定义一个对象保存搜索结果

	// 定义一个string保存与模式匹配的文本,以及不匹配的文本
	std::string test_str;
	while (getline(std::cin, test_str))
	{
		// 用r在test_str中查找与pattern匹配的子串
		if (regex_search(test_str, results, r))
		{
			std::ssub_match result = results[0];
			std::string ret_str = "[ " + results.str() + " ]";
			std::cout << ret_str << std::endl;
		}
	}
	return 0;
}

_________________________________________________________

指定regex对象的选项:

当我们定义一个regex对象,或对一个regex对象调用assign为其赋予新值时,可以指定一些标志来影响regex如何操作

regex

当前名称:正则表达式(C++)(施工中)
网站地址:https://www.cdcxhl.com/article4/jghooe.html

成都网站建设公司_创新互联,为您提供网站策划网站维护全网营销推广网页设计公司企业建站微信小程序

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发