IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C/C++ C++11]正则表达式 -> 正文阅读

[C++知识库][C/C++ C++11]正则表达式

一、为什么要学正则表达式
若要判断一个输入的QQ号是否有效,如何判断?
判断步骤:

  1. 长度大于5,小于等于10;
  2. 首位不能为0;
  3. 是否为纯数字?

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;
}

正则表达式只需几行代码就行了。

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

二、正则程序库(regex)
C++11 新增了正则表达式的标准库支持,本文简介 C++ 正则表达式的使用:
std::regex是C++用来表示正则表达式(regular expression)的库,它是class std::basic_regex<>针对char类型的一个特化,还有一个针对wchar_t类型的特化为std::wregex。
文档介绍
在这里插入图片描述

正则文法:
在这里插入图片描述
正则库:

regex
表示有一个正则表达式类,比如:regex pattern("(.{3})(.{2})_(\d{4})!")
regex_match
全文匹配,要求整个字符串符合正则表达式的匹配规则。用来判断一个字符串和一个正则表达式是否模式匹配,返回一个 bool 值,true 为匹配,false 为不匹配。匹配的含义是目标字符串必须完全和正则表达式相匹配,不能有多余的字符,如果需要部分匹配则应使用regex_search
regex_search 搜索匹配,根据正则表达式来搜索字符串中是否存在符合规则的子字符串。 能和正则表达式相匹配就返回true
regex_replace
替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容
sregex_iterator
迭代器适配器,调用regex_search来遍历一个string中所有匹配的子串
smatch/match_results
容器类,保存在string中搜索的结果。如果匹配成功,这些函数将成功匹配的相关信息保存在给定的smatch对象中。比如:smatch results;将匹配结果存放在results中,另一种存储方法声明:match_resultsstring::const_iterator result

匹配(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)

参数s为要匹配的字符串,pattern为匹配规则,result保存结果s.cbegin()+i,s.cend()对应s的匹配s迭代器所取的范围。

更多的时候我们希望能够获得匹配结果(字符串),对结果进行操作。这时就需要对匹配结果进行存储,共有两种存储方式。

match_resultsstring::const_iterator result;
smatch result; //推荐

如果需要保存结果,可以用第二种函数,用smatch result保存结果。
通常result[0]保存整个匹配结果,result[i]保存第i个捕获组的匹配结果,即模式中第i个括号的匹配结果。如果没有这样的结果则为空。
可以用result.size()查看一共有多少个匹配结果。

#include<iostream>
#include<regex>
using namespace std;
int main()
{
	string str = "Hello_2021";
	smatch result;
	regex pattern("(.{5})_(\\d{4})");	//匹配5个任意单字符 + 下划线 + 4个数字

	if (regex_match(str, result, pattern))
	{
		cout << result[0] << endl;		//完整匹配结果,Hello_2018
		cout << result[1] << endl;		//第一组匹配的数据,Hello
		cout << result[2] << endl;		//第二组匹配的数据,2018
		cout << "结果显示形式2" << endl;
		cout << result.str() << endl;	//完整结果,Hello_2018
		cout << result.str(1) << endl;	//第一组匹配的数据,Hello
		cout << result.str(2) << endl;	//第二组匹配的数据,2018
	}

	//遍历结果
	for (int i = 0; i < result.size(); ++i)
	{
		cout << result[i] << endl;
	}

}

result结构为如下图,result[0]为匹配的字符串,result[1]为Hello result[2]为2021
在这里插入图片描述
result[]与result.str()这两种方式能够获得相同的值,我更喜欢用数组形式的。
在匹配规则中,以括号()的方式来划分组别,实例中的规则共有两个括号,所以共有两组数据

搜索(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) //从字符串的某个位置开始匹配?

string str = "Hello 2018, Bye 2017";
smatch result;
regex pattern("\\d{4}");	//匹配四个数字

//迭代器声明
string::const_iterator iterStart = str.begin();
string::const_iterator iterEnd = str.end();
string temp;
while (regex_search(iterStart, iterEnd, result, pattern))
{
	temp = result[0];
	cout << temp << " ";
	iterStart = result[0].second;	//更新搜索起始位置,搜索剩下的字符串
}

输出结果:2018 2017

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

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

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

替换(Replace)
replace是替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。

string regex_replace(string s,regex p,string replace_str)

string str = "Hello_2021!";
regex pattern("Hello");	
cout << regex_replace(str, pattern, "") << endl;	
cout << regex_replace(str, pattern, "Hi") << endl;	

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 07:56:38  更:2021-11-25 07:57:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:36:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码