iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 正则表达式的应用详解
  • 103
分享到

C++ 正则表达式的应用详解

2024-04-02 19:04:59 103人浏览 安东尼
摘要

目录一、为什么要学正则表达式c++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式

一、为什么要学正则表达式

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

判断步骤:

  • 长度大于5,小于等于10;
  • 首位不能为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;
}

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

是不是很方便呢?那么接下来便来看看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++ 正则表达式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 正则表达式的应用详解

本文链接: https://www.lsjlt.com/news/158344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++ 正则表达式的应用详解
    目录一、为什么要学正则表达式C++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式...
    99+
    2022-11-12
  • C#正则表达式Regex用法详解
    目录一、正则表达式应用举例1、C#校验合法性:2、C#限制输入3、正则表达式匹配闭合HTML标签(支持嵌套)1、分组构造2、举例:二、.Net正则表达式测试器1、功能简介2、下载与安...
    99+
    2022-11-13
  • C#正则表达式与HashTable详解
    目录1、正则表达匹配规则转义字符限定字符分组()2、C#中正则表达式构建与匹配正则表达式的替换正则表达式拆分HashTable概述及元素添加Hashtable遍历Hashtable元...
    99+
    2022-11-13
  • Python正则表达式的应用详解
    目录正则表达式的定义Python对正则表达式的支持示例例1:验证输入的用户名是否有效,用户名由长度为6到20的字母、数字、下划线组成例2:从字符串中找到与正则表达式匹配的部分例3:从...
    99+
    2022-11-12
  • Javascript中正则表达式的应用详解
    目录stringsearchreplacematch:RegExp总结正则表达式 在前端中的应用也是比较常见的,我们在有时候也需要 用js 对某些字符串进行查找\捕获 或者 替换. ...
    99+
    2022-11-13
  • c++正则表达式怎么应用
    今天小编给大家分享一下c++正则表达式怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.正则表达式的需求检查一个串是...
    99+
    2023-07-06
  • C#正则表达式语法的应用
    这篇文章主要介绍“C#正则表达式语法的应用”,在日常操作中,相信很多人在C#正则表达式语法的应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式语法的应用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • 正则表达式用法详解
    正则表达式之基本概念 在我们写页面时,往往需要对表单的数据比如账号、身份证号等进行验证,而最有效的、用的最多的便是使用正则表达式来验证。那什么是正则表达式呢? 正则表达式(Regul...
    99+
    2022-11-12
  • C++中正则表达式的使用方法详解
    目录介绍1. C++ 中的正则表达式 (Regex)1.1 范围规范1.2 重复模式2. C++正则表达式的例子3. C++正则表达式中使用的函数模板3.1 regex_match(...
    99+
    2022-11-13
  • Python 正则表达式详解
    目录1.正则表达式是什么2.1用正则表达式2.2匹配原理2.3常用函数总结1.正则表达式是什么 很简单就是一种字符串匹配,eg: 比如你在注册账户时我们需要对用户的用户名判断是否合法...
    99+
    2022-11-12
  • JavaScript 正则表达式详解
    目录1. 正则表达式创建2. 使用模式2.1 使用简单模式2.2 使用特殊字符3. 应用3.1 切分字符串3.2 分组3.3 贪婪匹配3.4 正则表达式标志3.5 test() 方法...
    99+
    2022-11-12
  • Ruby正则表达式详解
    目录Ruby 正则表达式语法实例正则表达式修饰符正则表达式模式 正则表达式实例字符 字符类 特殊字符类 重复 非贪婪重复 ...
    99+
    2023-05-15
    Ruby 正则表达式 Ruby 正则表达式详解 Ruby 正则表达式实例
  • Java 正则表达式详解
    正则表达式(Regular Expression),又称为正规表达式、规则表达式、常规表示法等,是一种用来匹配、查找和替换字符串的工...
    99+
    2023-08-16
    Java
  • Python3的正则表达式详解
    目录1.简介2.切分字符串3.分组4.贪婪匹配5.编译总结1.简介 # 正则表达式:用来匹配字符串的武器; # 设计思想:用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符...
    99+
    2022-11-13
  • Python中使用正则表达式及正则表达式匹配规则详解
    目录1 导库2 使用模板3 说明4 示例5 正则表达式匹配规则1 导库 import re 2 使用模板 re_pattern = re.compile(pattern, flags...
    99+
    2023-03-22
    Python正则表达式匹配规则 Python正则表达式
  • C#使用正则表达式
    一.正则基础 1. []方括号表示匹配可以匹配方括号中的任意点单个字符,方括号只允许匹配单个字符。2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。3. ()...
    99+
    2022-11-13
  • 正则表达式grep用法详解
    grep是一个强大的文本搜索工具,它使用正则表达式来搜索和匹配文本。下面是grep的一些常用用法详解:1. 基本用法:grep pattern file这个命令会在文件中搜索匹配指定模式的行,并将其打印出来。pattern是一个正则表达...
    99+
    2023-08-11
    正则表达式
  • JavaScript中正则表达式的实际应用详解
    实际工作中,JavaScript正则表达式还是经常用到的。所以这部分的知识是非常重要的。 一、基础语法: 第一种:字面量语法 var expression=/pattern/f...
    99+
    2022-11-12
  • C++11正则表达式详解(regex_match、regex_search和regex_replace)
    目录字符规则regex_matchregex_searchregex_replace总结 在C++11中引入了正则表达式。 字符规则 先来了解一下这个字符的含义吧。 字符描...
    99+
    2022-11-13
  • Python中正则表达式详解
    基础篇 正则表达式在python中运用的非常多,因为他可以进行任意的匹配,可以匹配我们想要提取的信息。当我们接触正则的时候你就会知道正则的强大。正则有一个库re 在一些工程中我们会经常调用正则的库来做与匹配...
    99+
    2022-06-04
    详解 正则表达式 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作