我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中使用正则匹配问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中使用正则匹配问题

C/C++可以用正则表达式吗?

答案肯定是可以的,那么,今天一个简单的输入scanf带你走进正则的世界

#include<stdio.h>
int main()
{
    printf("input digate:");
    char str[100];
    scanf("%[0-9]", str);    //输入123456abc
    printf("%s", str);        //打印123456
}

在scanf时输入任何一串以数字开始的字符,那么str里面只会保存字符里面的第一串数字

input digate:123456abc
123456

先给出一些简单的正则

限定符含义
%[0-9]数字集合
%[^0-9]非数字集合
%[a-zA-Z]字母集合
%[^a-zA-Z]非字母集合

预热好了,正题开始…

若要判断一个输入的QQ号是否有效,如何判断?

判断步骤:

  • 长度大于5,小于等于11;
  • 首位不能为0;
  • 是否为纯数字?

C++string处理:

#include<iostream>
using namespace std;
int main()
{
	string qq = "7466a2063";
	if (qq.length() >= 5 && qq.length() <= 11)
	{
		// 2. 判断是否非'0'开头
		if (qq[0] != '0')
		{
			// 3. 判断是否为纯数字
			for each (char var in qq)
			{
				cout << var;
				if (var < '0' || var > '9')
				{
					cout << "不存在" << endl;
					return 0;
				}
			}
			cout << "存在" << endl;
		}
		else
		{
			cout << "不存在" << endl;
		}
	}
	else
	{
		cout << "不存在" << endl;
	}
	return 0;
}

虽然功能实现了但是非常麻烦

正则处理:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
    regex qq_reg("[1-9]\\d{4,11}");
    string qq = "746632063";
    smatch result;
    bool ret = regex_match(qq, result, qq_reg);
    cout << (ret ? "存在" : "不存在") << endl;
    return 0;
}

笑出了声,一行正则匹配就解决了

是不是很方便呢?那么接下来便来看看如何使用「正则表达式」。

正则程序库(regex)

「正则表达式」就是一套表示规则的式子,专门用来处理各种复杂的操作。

std::regex是C++用来表示「正则表达式」(regular expression)的库,于C++11加入,它是class std::basic_regex<>针对char类型的一个特化,还有一个针对wchar_t类型的特化为std::wregex。

正则文法(regex syntaxes)

std::regex默认使用是ECMAScript文法,这种文法比较好用,且威力强大,

常用符号的意义如下:

符号意义
^匹配行的开头
$匹配行的结尾
.匹配任意单个字符
[…]匹配[]中的任意一个字符
(…)设定分组
\转义字符
\d匹配数字[0-9]
\D\d 取反
\w匹配字母[a-z],数字,下划线
\W\w 取反
\s匹配空格
\S\s 取反
+前面的元素重复1次或多次
*前面的元素重复任意次
?前面的元素重复0次或1次
{n}前面的元素重复n次
{n,}前面的元素重复至少n次
{n,m}前面的元素重复至少n次,至多m次
|逻辑或

上面列出的这些都是非常常用的符号,靠这些便足以解决绝大多数问题了。

匹配(Match)

字符串处理常用的一个操作是「匹配」,即字符串和规则恰好对应,而用于匹配的函数为std::regex_match(),它是个函数模板

bool regex_match(string s,regex pattern)
bool regex_match(string s,smatch result,regex pattern)
bool regex_match(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配?

我们直接来看例子:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	
	regex pattern("^1[3578]\\d{9}$");	//1开头,后面[3578]中的一个,九个数字
	string s = "17779637570";
	smatch result;
	bool ismatch = regex_match(s, result, pattern);
	if (ismatch)
	{
		cout << "匹配成功:" << result[0] << endl;
	}
	else
		cout << "匹配失败" << endl;
	return 0;
}

匹配成功:17779637570

匹配成功并返回匹配到的结果

搜索(Search)

「搜索」与「匹配」非常相像,其对应的函数为std::regex_search,也是个函数模板,用法和regex_match一样,不同之处在于「搜索」只要字符串中有目标出现就会返回,而非完全「匹配」。

bool regex_search(string s,regex pattern)
bool regex_search(string s,smatch result,regex pattern)
bool regex_search(s.cbegin()+i,s.cend(),smatch result,regex pattern)  //从字符串的某个位置开始匹配?

搜索给定字符串中是否存在与模式匹配的子串,如果存在则返回true。

同样可以用smatch result记录结果,但不同的是result[0]记录的是整个字符串中从左往右第一个匹配模式的子串。

假如有多个子串符合模式,若想知道result[0]中存储的是第几个子串,可以用result.position()函数,返回数从0开始。

我们直接来看例子:

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	regex pattern("\\d+");	
	string s = "51x41+(5-13/2)x3a";
	smatch result;
	string::const_iterator iter_begin = s.cbegin();
	string::const_iterator iter_end = s.cend();
	while (regex_search(iter_begin, iter_end, result, pattern))
	{
		cout << "查找成功:" << result[0] << endl;
		cout << "查找结果子串的在源串中的迭代器位置" << *result[0].first << endl;
		cout << "查找结果子串的在源串后面的位置" << *result[0].second << endl;
		iter_begin = result[0].second;	//更新迭代器位置
	}
	return 0;
}

查找成功:51
查找结果子串的在源串中的迭代器位置5
查找结果子串的在源串后面的位置x
查找成功:41
查找结果子串的在源串中的迭代器位置4
查找结果子串的在源串后面的位置+
查找成功:5
查找结果子串的在源串中的迭代器位置5
查找结果子串的在源串后面的位置-
查找成功:13
查找结果子串的在源串中的迭代器位置1
查找结果子串的在源串后面的位置/
查找成功:2
查找结果子串的在源串中的迭代器位置2
查找结果子串的在源串后面的位置)
查找成功:3
查找结果子串的在源串中的迭代器位置3
查找结果子串的在源串后面的位置a

替换(Replace)

最后一种操作称为「替换」,即将正则表达式内容替换为指定内容,regex库用模板函数std::regex_replace提供「替换」操作。

string regex_replace(string s,regex p,string replace_str)    //有其他重载用法

现在,给定一个数据为"he…ll…o, worl…d!", 思考一下,如何去掉其中误敲的“.”?

#include<iostream>
#include<regex>
using namespace std;
int main()
{
    char data[] = "he...ll..o, worl..d!";
    regex reg("\\.");    //正则匹配点.
    cout << regex_replace(data, reg, "");    //将正则匹配到的点替换成无,即删除点
    return 0;
}

hello, world!

删除了没必要的点,是不是贼方便…

对字符串data中与模式匹配的所有子串进行相应的字符串替换,替换字符串引用匹配子串中的内容,引用方法如下

转义序列替换为
$n匹配第n个捕捉组的字符串。例如$l表示第一个捕捉组,$2表示第二个,依此类推
$&匹配整个正则表达式的字符串,等同于$0
$`在源字符串中,在匹配正则表达式的子字符串左侧的部分
$’在源字符串中,在匹配正则表达式的子字符串右侧的部分
$$美元符号
#include<iostream>
#include<regex>
using namespace std;
int main()
{
	char data[] = "001-Neo,002-Lucia";
	regex reg("(\\d+)-(\\w+)");
	cout << regex_replace(data, reg, "$1 name=$2");
	return 0;
}

001 name=Neo,002 name=Lucia

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中使用正则匹配问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++中使用正则匹配问题

这篇文章主要介绍了C++中使用正则匹配问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

C#中如何使用正则表达式和字符串匹配

C#中如何使用正则表达式和字符串匹配正则表达式是一种强大的文本处理工具,它可以帮助我们有效地在字符串中进行模式匹配和提取。在C#中,通过使用System.Text.RegularExpressions命名空间下的Regex类,我们可以轻松地
2023-10-22

Python中使用正则表达式及正则表达式匹配规则详解

这篇文章主要介绍了Python中使用正则表达式以及正则表达式匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-22

Qt之QRegularExpression正则匹配怎么使用

这篇文章主要介绍“Qt之QRegularExpression正则匹配怎么使用”,在日常操作中,相信很多人在Qt之QRegularExpression正则匹配怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-07-05

Notepad++怎么使用正则表达式匹配

今天小编给大家分享一下Notepad++怎么使用正则表达式匹配的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Notepad+
2023-07-06

php怎么使用正则匹配去掉html

php使用正则匹配去掉html方法:1、创建一个php示例文件;2、定义一个HTML标签的字符串“$html_string”;3、使用正则表达式“/<[^<]+>/”匹配所有html标签;4、使用“preg_replace("/<[^<]+>/",$html_string)”语法删除html标签即可。
2023-05-24

Notepad++使用正则表达式匹配的方法

这篇文章主要介绍了Notepad++使用正则表达式匹配的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

Python中怎么使用正则表达式匹配方法

本篇文章为大家展示了Python中怎么使用正则表达式匹配方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.测试正则表达式是否匹配字符串的全部或部分regex=ur"" #正则表达式 if re
2023-06-17

怎么使用php正则匹配所有文字

使用PHP正则表达式可以使用preg_match_all()函数来匹配所有文字。下面是一个示例代码:```php$text = "Hello, World!";$pattern = "/./u"; // 匹配所有字符(包括Unicode字符
2023-09-26

Android中怎么利用正则匹配图片

这期内容当中小编将会给大家带来有关Android中怎么利用正则匹配图片,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。xml
2023-05-31

怎么使用PHP中全局正则表达式匹配及匹配数组元素

这篇文章主要介绍“怎么使用PHP中全局正则表达式匹配及匹配数组元素”,在日常操作中,相信很多人在怎么使用PHP中全局正则表达式匹配及匹配数组元素问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP中全
2023-06-25

怎么在python中使用正则match( )方法匹配目标

这期内容当中小编将会给大家带来有关怎么在python中使用正则match( )方法匹配目标,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、正则表达式作用给定的字符串是否符合正则表达式的过滤逻辑(“匹配”
2023-06-14

在Java中使用正则表达式匹配${key}的方法

这篇文章将为大家详细讲解有关在Java中使用正则表达式匹配${key}的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.正则表达式匹配${key}\$\{([a-z]+)\} 能够匹配字符串中以${
2023-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录