c++正则表达式

2023-05-16

https://blog.csdn.net/qq_62309585/article/details/126776015

对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没 有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。

C++11 提供的正则表达式库操作 std::string 对象,模式 std::regex (本质是 std::basic_regex) 进行初始化,通过 std::regex_match 进行匹配,从而产生 std::smatch(本质是 std::match_results 对象)。

我们通过一个简单的例子来简单介绍这个库的使用。考虑下面的正则表达式:

[a-z]+.txt: 在这个正则表达式中, [a-z] 表示匹配一个小写字母, + 可以使前面的表达式匹配多 次,因此 [a-z]+ 能够匹配一个小写字母组成的字符串。在正则表达式中一个 . 表示匹配任意字 符,而 . 则表示匹配字符 .,最后的 txt 表示严格匹配 txt 则三个字母。因此这个正则表达式的 所要匹配的内容就是由纯小写字母组成的文本文件。

std::regex_match 用于匹配字符串和正则表达式,有很多不同的重载形式。最简单的一个形式就是 传入 std::string 以及一个 std::regex 进行匹配,当匹配成功时,会返回 true,否则返回 false。例 如:

#include <iostream>
#include <string>
#include <regex>
int main() {
std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};
// 在 C++ 中 \ 会被作为字符串内的转义符,为使 \. 作为正则表达式传递进去生效,需要对 \ 进行二次转义,从而有 \\.
std::regex txt_regex("[a-z]+\\.txt");
for (const auto &fname: fnames)
std::cout << fname << ": " << std::regex_match(fname, txt_regex) << std::endl;
}

另一种常用的形式就是依次传入 std::string/std::smatch/std::regex 三个参数,其中 std::smatch 的本质其实是 std::match_results。在标准库中,std::smatch 被定义为了 std::match_results, 也就是一个子串迭代器类型的 match_results。使用 std::smatch 可以方便的对匹配的结果进行获取

#include<iostream>
#include<string>
#include<regex>
 
int main()
{
    std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};
// 在 C++ 中 \ 会被作为字符串内的转义符,为使 \. 作为正则表达式传递进去生效,需要
    std::regex base_regex("([a-z]+)\\.txt");
    std::match_results<std::string::const_iterator> base_match;
    for(const auto& fname : fnames)
    {
        if(std::regex_match(fname,base_match,base_regex))
        {
            // std::smatch 的第一个元素匹配整个字符串
            // std::smatch 的第二个元素匹配了第一个括号表达
            if (base_match.size() == 2){
            std::string base = base_match[1].str();
            std::cout << "sub-match[0]: " << base_match[0].str() << std::endl;
            std::cout << fname << " sub-match[1]: " << base << std::endl;
            } 
 
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++正则表达式 的相关文章

  • java用正则表达式脱敏手机号

    一种正则形式 在Java开发中有时候需要对敏感字段数据脱敏 废话不多说 直接上代码 脱敏手机号 param str return 脱敏后字符串 public static String maskPhone String str return
  • 常用数字电路模块之三:计数器与分频器(二))

    三 分频电路 1 简单的计数器 计数器实质是对输入的驱动时钟进行计数 所以计数器在某种意义上讲 等同于对时钟进行分频 例如一个最大计数长度为N 2 n 从0计数到N 1 的计数器 也就是寄存器位数位n 那么寄存器最高位的输出为N 2 n分频
  • 正则表达式基础语法大全

    正则表达式基础语法 1 普通字符 字母 数字 汉子 下划线 以及没有特殊定义的标点符号 都是 普通字符 表达式中的普通字符 在匹配一个字符串的时候 匹配与之相同的一个字符 2 简单的转义字符 3 标准字符集合 能够与 多种字符 匹配的表达式
  • VB.Net常用的正则表达式(实例)

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • JavaScript最后分水岭——正则表达式

    个人简介 个人主页 微风洋洋 博客领域 编程基础 后端 写作风格 干货 干货 还是tmd的干货 精选专栏 JavaScript 支持洋锅 点赞 收藏 留言 好久不见 甚是想念 大家好 我是微风洋洋 也可以叫我洋锅 细心地小伙伴可能已经发现
  • 爬虫入门_3:数据解析及案例实战

    聚焦爬取 爬取页面中指定的页面内容 编码流程 指定url 发起请求 获取响应数据 数据解析 持久化存储 数据解析分类 正则 re M 多行匹配 re S 单行匹配 bs4 xpath 数据解析原理概述 解析的局部的文本内容都会在标签之间或者
  • 正则表达式大全,一篇前后端都可用

    正是掌握了这些正则表达式 冰河平均每天比别人少写200行代码 极大的提高了研发效率 熟练的掌握正则表达式 能够帮助程序员以最快的速度写出最优雅的代码 冰河在多年的编程工作中 对使用过的正则表达式进行了梳理和总结 这些正则表达式能够帮助你节省
  • grep命令

    grep 全称是global regular expressions print 功能就是查找匹配模式的行 grep对文本内容的处理是以行为单位 输出也是输出匹配的行 也可以使用两个变种程序egrep和fgrep egrep与grep E相
  • 对字符串进行正则取子串

    题目是这样的 对一段HTML网页内容 解析出其中所有的键值对 比如其中type text type为属性 text为值 二者为一个键值对 内容如下
  • 使用正则表达式爬虫抓取猫眼电影排行Top100

    目标站点分析 分析网址 首页 https maoyan com 点击榜单 https maoyan com board 点击Top100 https maoyan com board 4 目标站点为 https maoyan com boa
  • python爬虫之数据解析

    python爬虫之数据解析 正则表达式 bs4 xpath 主要运用在聚焦爬虫模块中 涉及到的数据解析方法有 正则表达式 bs4以及xpath 1 使用对象 聚焦爬虫 聚焦爬虫 爬取页面中指定的页面内容 2 数据解析原理概述 解析的局部的文
  • test is not a function (js正则表达式匹配问题)

    js中正则表达式匹配时 如果使用test函数 就必须不带引号 并且必须是 定义的规则变量 test 要测试的string 定义变量规则不要带引号 会错误的 如果不使用test 使用match则可以带引号 var re 1 9 d 4 10
  • 【按照年月去统计信息并分类展示】

    1 前言 需求是需要将历史订单按照年月分类展示 并展示汇总值 由于后端返回的是数组的数据 并没有将数据做好统计分类 出于对自己的自信以及不想给别人添麻烦的信息 然后自己写了一下处理的方法 然后放上最后的效果图吧 2 代码实现 按照月份统计每
  • 中文姓名、电话、邮箱的正则表达式

    1 中文姓名 如 张三 噶及 洛克业 a zA Z0 9 u4e00 u9fa5 1 10 2 电话验证 如 010 85369999 186199999 0 d 2 3 d 7 8 d 3 5 13 14 15 18 17 d 9 3 电
  • Python命令行参数定义及注意事项

    在命令行中运行python代码是很常见的 下面介绍如何定义命令后面跟的参数 常规用法 Python代码中主要使用下面几行代码来定义并获取需要在命令行中赋值的参数 import argparse parser argparse Argumen
  • 表示数值的字符串(含思路解答示意图)【剑指offer——JAVA实现】

    题目描述 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值 但是 12e 1a3 14 1 2 3 5 和 12e 4 3 都不是 解法一 思路 状态机
  • [网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)

    这是作者的系列网络安全自学教程 主要是关于网安工具和实践操作的在线笔记 特分享出来与博友共勉 希望您们喜欢 一起进步 前文分享了Wireshark抓包原理知识 并结合NetworkMiner工具抓取了图像资源和用户名密码 本文将讲解Pyth
  • MySQL 通配符学习小结

    原文 http blog csdn net ithomer article details 5130386 MySQL 通配符 SQL的模式匹配允许你使用 匹配任何单个字符 而 匹配任意数目字符 包括零个字符 在 MySQL中 SQL的模式
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • Python 正则表达式指南

    文章目录 1 正则表达式基础 1 1 简单介绍 1 2 数量词的贪婪模式与非贪婪模式 1 3 反斜杠的困扰 1 4 匹配模式 2 re模块 2 1 开始使用re 2 2 Match 2 3 Pattern 1 正则表达式基础 1 1 简单介

随机推荐

  • 电脑显示WiFi已连接,但无法访问internet怎么解决?

    我在玩游戏的时候电脑突然卡崩了 xff0c 我无奈的重启了一下 xff0c 结果电脑重启后连不上网了 xff0c 我开始以为还在重新连接 xff0c 在等待 xff0c 过了好久才发现其实早就连上wifi了 xff0c 但显示无法连接int
  • Python-Django-模型

    一 ORM 模型介绍 1 ORM 模型 对象关系映射 xff08 英语 xff1a Object Relational Mapping xff0c 简称ORM xff0c 或ORM xff0c 或OR mapping xff09 xff0c
  • LeetCodeWeeklyContest-159

    最近看了篇文章 xff0c 文章里说 希望你身边能有个比你聪明五倍 xff0c 但却比你还努力十倍的人 倍数虽然有些夸张 xff0c 但是这个思想还是能get到的 5230 缀点成线 在一个 XY 坐标系中有一些点 xff0c 我们用数组
  • 获取安卓设备唯一标识方法总结

    安卓设备的唯一标识的方法并不唯一 xff0c 也没有哪种方法能够适用于所有的Android设备 xff0c 下面列出几种常见的方式 xff0c 可以根据需要选择 1 IMEI 码 IMEI xff08 国际移动设备识别码 xff09 唯一编
  • Anaconda安装及环境变量配置(Ubuntu)

    安装Anaconda 下载软件 Anaconda下载地址打开终端 xff0c 进入到安装包的存放路径输入命令 xff1a span class token function bash span namexxxxx span class to
  • 快速幂——原理及实现

    这篇文章讲一下快速幂的问题 xff1b 首先问一个简单的问题 xff1a 23是几 xff1f 很简单啊 xff0c 是不是 xff1f 答案是8 xff1b 那么是怎么得来的呢 xff1f 222 61 8 xff1b 连续乘了3次2 x
  • 适合小白的几个入门级Python ocr识别库

    1 pytesseract 2 PaddleOCR 3 easyocr 4 muggle ocr 5 dddd ocr 6 其他 工作生活中经常会遇到需要提取图片中文字信息的情况 xff0c 以前都是手动自己把图片里的字敲出来 xff0c
  • WSL使用中遇到坑

    1 开机启动配置项 在WSL中配置的一些服务如nginx xff0c mysql xff0c ssh等 xff0c 每次开机都会需要手动开启 xff0c 参考网上的开机服务配置都是通过往 etc rc local里面添加启动脚本 xff0c
  • 云服务器Ubuntu(无桌面)安装远程桌面

    如果主机上安装的ubuntu是桌面版 xff0c 打开桌面共享即可使用Windows的远程桌面进行链接 详细参考ubuntu20 10中设置桌面共享的三种方式 任选其一 的第一部分 本文主要说明如何在Ubuntu云服务器上安装远程桌面 一
  • win10解决photoshop打不开问题

    win10 的权限跟win7有些地方不一样 xff0c 对于一直使用win7的人可能很不习惯 xff0c 我在win10上面用photoshop的时候 xff0c 出现打不开photoshop的时候 xff0c 如果你也有类似的情况 xff
  • iOS UIAlertController控件

    UIAlertController取代UIAlertView和UIActionSheet xff0c 用于界面弹出一个警告视图 初始化方法 xff0c UIAlertControllerStyle分为UIAlertControllerSty
  • 用递归和非递归实现斐波那契数列(C语言)

    斐波那契数列 xff08 Fibonacci sequence xff09 xff0c 又称黄金分割数列 因数学家列昂纳多 斐波那契 xff08 Leonardoda Fibonacci xff09 以兔子繁殖为例子而引入 xff0c 故又
  • cmd设置全局环境变量和用户环境变量

    register env bat 64 echo off echo add sg generator evn 输出空行echo set generator home 61 cd echo SG GENERATOR HOME generato
  • 如何下载4399游戏到本地并修改数值

    一直很纠结mac不能玩什么游戏 xff0c 只能通过4399来解乏了 8过4399的页面过于臃肿 xff0c 无法安心玩游戏 xff0c 于是有了这个想法 至于修改数值嘛 xff0c 嘿嘿 测试环境 xff1a mac air m1 43
  • g++版本控制,apt安装g++11

    安装g 43 43 11 span class token function sudo span add apt repository y ppa ubuntu toolchain r test span class token funct
  • git设置代理

    设置全局代理 http span class token function git span config global https proxy http 127 0 0 1 1080 https span class token func
  • Collecting package metadata (current_repodata.json)解决方法

    先运行命令conda clean i看看是否有效 删除 condarc文件 使用 conda config set show channel urls true 重新生成
  • postgresql page页结构

    前言 postgresql 保存数据的基本单位是 page xff0c 一个 page 里包含多条数据 postgresql 同磁盘的读写单位也是 page xff0c 一个 page 对应于磁盘的一个 block block 的格式和 p
  • StringPiece谷歌实现

    typedef BasicStringPiece span class token operator lt span std string span class token operator gt span StringPiece span
  • c++正则表达式

    https blog csdn net qq 62309585 article details 126776015 对字符串内容进行匹配的最常见手段就是使用正则表达式 可惜在传统 C 43 43 中正则表达式一直没 有得到语言层面的支持 x