正则表达式 regex

shell之正则表达式及三剑客grep命令 阅读详情

参考

regex可以很简单 也可以很复杂

/* 限定符                                           修饰前面的一个字符,可以是元字符
 *                     重复0次或更多次
 +                     重复1次或更多次               []里的+就只是一个"+"字符了           
 ?                     重复0或1次 
 {n}                   重复n次
 {n,}                  重复n或更多次
 {n,m}                 重复n到m次

例:abc* 表示可匹配 以ab 开头后面没有c或有多个c       
  \d{5} 表示\d匹配到的数字连续出现5次

元字符                                                 匹配单个字符
.                      匹配除换行符以外的任意单个字符
^                      表示匹配行首的文本(以什么表达式开始)
$                      表示匹配行尾的文本(以什么表达式结束)
\s                     匹配任意的空白
\S                     匹配任意不是空白符的字符
\d                     匹配数字
\D                     匹配任意非数字的字符
\w                     匹配字母或数字或下划线
\W                     匹配不是字母数字下划线的字符
\b	                   匹配一个单词边界 所谓'单词边界' 请参考https://blog.youkuaiyun.com/weixin_42636353/article/details/82466892
\B	                   非字边界匹配。

其他
[]                      匹配其中的任意一个字符  相当于或的意思   [abcd]
[^]                     匹配除了方括号内的字符  相当于取反   [^abcd]
[n-m]                   匹配n到m范围内的任意 一个字符        [0-9] 这是\d的全写       [^0-9] 这是\D的全写 可和其她范围连用  [0-9A-z_]
\                       转义符 转特殊字符为要匹配的字符      \.  匹配.     \\  匹配\  \/ 匹配/
|                       前面一大部分或者后面一大部分    如果要改变范围可用()   如     b(o|a)y    匹配boy bay
[\u4e00-\u9fa5]         匹配汉字

正则表达式还有很多还有待深究

单词边界

  • 单词边界是指一个单词的开头或结尾,或者一个单词和一个非单词字符之间的位置。

在正则表达式中,单词边界是用\b表示,它并非指字符,而是指单词和非单词之间的位置,比如一个单词后面跟着一个空格,那么这个空格和这个单词之间就是一个单词边界。除了单词边界和非单词边界表示位置外,行首^和行尾$也是表示位置。

捕获组

  • (组) 用圆括号分组
// 原始字符串,由 '|' 分隔
std::string s = "part1|part2|part3";

// 正则表达式模式,匹配由 '|' 分隔的第二部分
// 我们使用捕获组来保留前后部分
std::regex pattern("(\\w+)\\|(\\w+)\\|(\\w+)");

// 替换字符串,捕获到的用replacement的内容替换 下面这是种拼接
std::string replacement = "$1|new_part|$3";

// 使用正则表达式进行替换
std::string result = std::regex_replace(s, pattern, replacement);
// 输出替换后的字符串
std::cout << result << std::endl;

输出:

part1|new_part|part3

        // 原始字符串
        std::string s = "The quick brown fox jumps over the lazy dog dog";

        // 正则表达式,匹配重复的单词
        std::regex e("(\\b\\w+)\\s+\\1\\b");

        // 替换字符串,其中\\1是一个反向引用,引用了第一个捕获组
        std::string r = "$1"; // 只保留第一个匹配的单词  或者"555"替换 上面的 重复的dog

        // 执行替换
        std::string result = std::regex_replace(s, e, r);

        // 输出结果
        std::cout << result << std::endl;

输出:

The quick brown fox jumps over the lazy dog

反向引用 与 提取数据

  • 上面$1 (这里1是组号 表示第一个组) 就是提取匹配组匹配到的数据
    std::string s = "I have an apple apple2.";
    std::regex e(R"((apple)\s+(apple2))");
    std::string r = R"($2 orange1)"; // 使用$1引用第一个捕获组,即第一个"apple"
    std::string result = std::regex_replace(s, e, r); //
    std::cout<<result<<std::endl;
    
    >.R"()"是CLion编译器提供支持的被其修的字面字符量不需要手动转义转义字符的写法
    输出:

    I have an apple2 orange1.

  • 反向引用
    假设你想在一个字符串中查找连续重复的单词,如"the the"或"is is"。你可以使用以下正则表达式
    std::regex e("(\\b\\w+)\\s+\\1\\b");
    
    上面的 \1 就是反向引用第一组的内容

先行断言

  • 正向先行断言
    (?=p) 匹配后面紧挨着p的字符, p可以是多个字符 也可以是匹配规则
    std::string s = "123 abc 456, 7890, more text 123";
    std::regex e("(\\d+)(?=,)"); // 匹配数字,后面紧跟着一个逗号(但不包括逗号)
    
    // 使用sregex_iterator进行匹配
    std::sregex_iterator begin(s.begin(), s.end(), e);
    std::sregex_iterator end;
    
    for (std::sregex_iterator i = begin; i != end; ++i) {
        std::smatch match = *i;
        std::string match_str = match.str();
        std::cout << "Matched: " << match_str << std::endl;
    }
    
    输出:

    456
    7890

    std::string s = "123 abc 456, 7890, more text 123";
    std::regex e("(\\d+)(?= [A-z])"); // 匹配后面是空格,然后后面紧跟着一个字母的数字
    
    // 使用sregex_iterator进行匹配
    std::sregex_iterator begin(s.begin(), s.end(), e);
    std::sregex_iterator end;
    
    for (std::sregex_iterator i = begin; i != end; ++i) {
        std::smatch match = *i;
        std::string match_str = match.str();
        std::cout << "Matched: " << match_str << std::endl;
    }
    
    输出:

    123

  • 负向先行断言
    (?!p) 匹配 后面没有紧挨着p的字符
  • 注意事项
    • 先行断言是一种零宽断言,这意味着它不会消耗任何字符,只是简单地检查后续字符是否满足某个条件。
    • 先行断言在性能上可能比较昂贵,因为它需要“向前看”来检查条件是否满足。在复杂的正则表达式或大型文本中,这可能会影响匹配的速度。

非捕获括号

  • (?:p) 分组而不捕获,看起来像分组, 其实不算进分组的引用里面
  • 所以无法$1 \1这样引用到非捕获括号匹配的数据因为它没有捕获
  • 这意味着如果混合在捕获分组里, 也不会影响捕获分组的引用顺序
  • 在一些需要把其作为匹配条件, 但又不需要引用到其匹配的字符的场景下可能有用
std::string s = "123 abc 456,456 7890, more text 123";
std::regex e("(123).*(?:abc).*(456).*(\\2)");//这里第二个分组是456 引用它

std::string r = R"($2 orange1)"; // 使用$2引用第二个捕获组,即 456
std::string result = std::regex_replace(s, e, r); // 
std::cout<<result<<std::endl;

输出:

456 orange1 7890, more text 123

贪婪匹配 & 惰性匹配

  • 默认是贪婪匹配, 尽可能多的匹配
    比如我要匹配以 lib 开始的 以 .dll 结尾的
std::string long_string = "sadfd-_libshdf*-.-.dll sadf libhello.dll libsome-1.0.dll aaa";

// 定义正则表达式模式
std::regex pattern(R"(lib.*\.dll)");

// 使用 sregex_iterator 查找所有匹配项
auto begin = std::sregex_iterator(long_string.begin(), long_string.end(), pattern);
auto end = std::sregex_iterator();

// 遍历所有匹配项并输出
for (std::sregex_iterator i = begin; i != end; ++i) {
    std::smatch match = *i; // 获取当前匹配项
    std::cout << "'" << match.str() << "' 在长字符串中匹配成功\n";
}

输出:

‘libshdf*-.-.dll sadf libhello.dll libsome-1.0.dll’ 在长字符串中匹配成功

但里面嵌套了一些符合要求的
如果我想要就近结束一段匹配, 就需要使用惰性匹配
在量词后面加个问号就能实现惰性匹配

std::string long_string = "sadfd-_libshdf*-.-.dll sadf libhello.dll libsome-1.0.dll aaa";

// 定义正则表达式模式
std::regex pattern(R"(lib.*?\.dll)");

// 使用 sregex_iterator 查找所有匹配项
auto begin = std::sregex_iterator(long_string.begin(), long_string.end(), pattern);
auto end = std::sregex_iterator();

// 遍历所有匹配项并输出
for (std::sregex_iterator i = begin; i != end; ++i) {
    std::smatch match = *i; // 获取当前匹配项
    std::cout << "'" << match.str() << "' 在长字符串中匹配成功\n";
}

输出:

‘libshdf*-.-.dll’ 在长字符串中匹配成功
‘libhello.dll’ 在长字符串中匹配成功
‘libsome-1.0.dll’ 在长字符串中匹配成功

boost.regex正则表达式 boost::regex正则表达式 阅读详情

相关推荐

C++正则表达式regex使用总结

正则表达式(regular expression)的C++库regex是一种强大的描述字符序列的工具 , C++11中也将正则表达式纳入了新标准的一部分。regex库中常用组件介绍在头文件中包含了多个我们使用正则表达式时需要用到的组件,即 #includeregex库组件详细介绍如下regex表示有一个正则表达式类,比如:regex pattern(“(.{3})(.{2})_(\d{4})!”)全文匹配,要求整个字符串符合正则表达式的匹配规则。

喜欢打篮球的普通人 4197

正则表达式匹配行首和行尾

在平常我们经常有这样的一种场景,需要在行首或者行尾加上一个分号或者双引号,这个时候如果每行都是对齐的,我们可以使用列编辑的方式,如果每行不是对齐的,怎么办呢?我们可以使用正则表达式来匹配行首和行尾。 行首: ^ 行尾: $ 然后我们就可以批量的来对行首和行尾进行处理了。 ...

远方的少年 9917

C++笔记之regex(正则表达式)

当中的最后一个参数为0时,它会返回正则表达式的完整匹配,这与的基本行为相同。构造函数的参数不同接收一个额外的整数参数,即使是0,来指定要返回的匹配或子匹配。不接收这样的参数,因为它总是返回完整的匹配。返回类型不同的解引用操作返回的是对象,它表示一个字符序列,可以转化为。的解引用操作返回的是对象,它包含了完整匹配和所有子匹配。通常,我们通过调用str()方法来获取匹配的字符串。性能方面可能有差异尽管两者在行为上非常相似,但是因为设计上更通用,可能在某些实现中比稍微低效。

小勇博客 980

Notepad++正则表达式(一)

notepad++快速选中一列;notepad++正则表达式;Notepad++的正则表达式更改日期格式

m0_60615714的博客 5546

关于HC32F460 输出可调占空比PWM波遇到的问题记录

文章目录问题记录一、问题分析二、解决方法总结 问题记录 芯片:HC32F460系列 功能:PWM电机调速 最近产品开发,需要用到HC32的PWM输出来控制电机的转速。参考官方的例程很快就完成了相关的功能,但是,后面在测试,重复开关电机的时候,发现电机的转速时大时小。 一、问题分析 一开始,怀疑是相关寄存器的设置出错导致的问题。因此在设置PWM输出时加上LOG打印,上机测试并没有发现问题。 用示波器抓取波形,这是正常状态下的波形(上电默认配置成5kHz,70%占空比输出) 这是转速较小时的波形输出 .

Top0_0lll的博客 6165

本地 AI 自由!OpenClaw+Ollama 双系统部署教程(Windows/Linux),零成本离线跑大模型

本文详细介绍了如何在Windows和Linux双系统中部署OpenClaw AI助手,并通过Ollama对接本地大模型实现完全离线使用。教程包含环境准备、OpenClaw安装配置、Ollama本地模型部署、系统对接等完整流程,特别强调隐私安全和零Token消耗的优势。针对不同操作系统提供具体命令,并给出常见问题解决方案,即使是新手也能快速搭建专属本地AI助手。最终实现的方案无需联网、无使用成本,且能保障数据隐私安全。

2501_93651177的博客 7228

Linux 正则表达式的基础使用

正则表达式;基本正则元字符;扩展正则元字符;^;$;.;*;.*;[ ];[ - ];[^];\;\;\(\);=;!=;=~;+;?;|;();x{m};x{,m};x{m,};x{n,m};\s;\d

Sakura_QKS的博客 3491

Unity-Mirror网络框架-从入门到精通之MultipleMatches示例

Multiple Matches 示例主要讲述了如何在使用 Mirror 网路框架时管理多个游戏匹配。以及如何设置一个能够同时支持多个游戏会话的系统,使玩家能够加入他们所选择的比赛,而不是强制他们加入一个单一的匹配。

TxNet 963

正则表达式

正则表达式(Regular Expression)是用来匹配字符串中字符组合的模式

qq_45909901的博客 210

向华为学习——IPD流程体系之IPD术语

《IPD体系核心概念与业务术语解析》摘要: IPD(集成产品开发)是一种以市场为导向的结构化产品开发管理模式,通过跨部门协作、异步开发、CBB(通用构建模块)和管道管理等手段,实现产品全生命周期高效管理。体系包含七大核心要素:跨部门团队(如IPMT决策层、PDT执行层)、结构化流程(分阶段评审)、端到端项目管理(WBS分级计划)、客户需求分析、投资组合优化及质量管控(TR技术评审)。各业务领域术语涵盖财务(NPV、IRR)、开发(需求分解、基线化)、制造(可制造性设计)、采购(Sourcing团队)及市场(

cdfunlove的博客 480

提示词驱动的多智能体协作系统

《提示词驱动的多智能体协作系统》 关键词:人工智能、多智能体系统、协作机制、提示词驱动、系统设计与应用 摘要:本文深入探讨提示词驱动的多智能体协作系统,首先介绍其背景和核心概念,然后详细分析多智能体系统的基本原理和提示词驱动的协作机制,最

AI天才研究院 846

C++正则表达式regex_match,regex_search和regex_replace简单使用

一、说明: C++11之后引入了正则表达式,给文本处理带来了很多方便的地方,正则表达式处理能力很强但想熟练使用并不容易,C++中主要使用下面的三个函数进行正则表达的操作。 1、regex_search:在整个字符串中匹配到符合正则表达式规则中的一部分就返回true,也就是子串。 2、regex_match:在整个字符串中匹配到符合整个表达式的整个字符串时返回true,也就是匹配的是整个字符串。 3...

ISmileLi的博客 1万+

基于语义分割的实时建图:HDMap动态更新

基于语义分割的实时建图:HDMap动态更新​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于语义分割的实时建图技术在HDMap动态更新中的应用展开,介绍了语义分割基础、HDMap概述、相关实时建图技术、动态更新关键技术、系统性能评估指标、实际应用案例、面临的挑战与解决方案及未来发展趋势。阐述了该技术如何利用传感器数据和语义分割算法,解决传统HDMap构建与更新的弊端,分析了其在精度、实时性、鲁棒性等方面的表现,以及在自动驾驶和智能交通中的应用,还探讨了现存问题及未来优化方向。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

C++正则表达式regex库使用方法总结

目录 一、regex库中常用组件介绍 二、regex库中常用组件使用 1、regex库组件使用准备 2、regex_match使用 3、regex_search使用 4、regex_replace使用 5、sregex_iterator使用 三、基于regex库组件构建自己的正则接口类 1、C++正则表达式接口类设计 2、C++正则表达式接口类使用 四、部分语法规则介绍 正...

分享实践与思考 4万+

匹配博弈双边选择算法

刚学图论匹配方面的一些知识,记录下来。

ymengm的博客 2434

【AI智能体】Codex 开发聚合搜索应用项目实战操作详解

Codex 开发聚合搜索应用项目实战操作详解

congge 3094

【C++】regex 正则表达式

    正则表达式是一种描述字符序列的方法,是C++11标准库中新加入的强大工具。正则表达式是一种用于字符串处理的微型语言,适用于一些与字符串相关的操作。C++11包含了对以下几种语法的支持:ECMAScript、basic、extended、awk、grep和egrep。C++11中使用的默认语法是ECMAScript。     RE库定义在头文件regex中,它包含多个组件: 匹配 ...

Twinkle 2632

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++ regex 正则表达式的使用

在c++中,有三种正则可以选择使用,C ++regex,C regex,boost regex ,如果在windows下开发c++,默认不支持后面两种正则,如果想快速应用,显然C++ regex 比较方便使用。文章将讨论C++ regex 正则表达式的使用。

没有开花的树 7万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【笔记】c++ - 正则表达式: GNU Regex Library、PCRE, PCRE++、Boost.Regex

GNU Regex Library 是glibc(GNU C Library)的一部分,它提供与POSIX标准兼容的正则表达式匹配的接口。是一种十分简便、灵活的文本处理工具,可以用来精确地找出某文本中匹配某种指定规则的内容。上述信用卡格式是人读的,还有机器格式:数字,15到16位长度,不分组,中间每连接符。PCRE++是一个对PCRE库的C++封装,它提供了更加方便、易用的C++接口。这四个库中,后面两个是有关系,其它都是各自己独立的,是不同的实现。在结果表达式中,可以用数字只带匹配到的结果,得到。

LawssssCat的博客 1191

C++正则表达式(regex_match、regex_search与regex_replace)

前言 1 转义字符 2 regex_match 2.1 基本概念 2.2 匹配结果 2.3 实例 3 regex_search 3.1 基本概念 3.2 实例 4 regex_replace 4.1 基本概念 4.2 扩展 5 匹配忽略大小写 6 帮助网站 1 转义字符 cout << regex_match("123", regex(...

qq_35886593的博客 7592

C++11正则表达式详解(regex_match、regex_search和regex_replace)

正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,下面这篇文章主要介绍了C++11正则表达式(regex_match、regex_search和regex_replace)的相关资料,需要的朋友可以参考下。

m0_54901781的博客 1763

C# Regex 深入正则表达式

C# Regex 深入正则表达式         正则表达式(Regular expressions)是一套语法匹配规则,各种语言,如Perl, .Net和Java都有其对应的共享的正则表达式类库。在.Net中,这个类库叫做Regex。 简单的说,Regex是从字符窗中查找匹配字符串的应用类。通过Regex,编程人员能够非常方便的从一段数据中提取自己所需要的数据信息。举

jyz123456的专栏 987

C++参悟:正则表达式库regex

C++标准库为我们提供了处理字符串的正则表达式库。正则表达式是一种用于在字符串中匹配模式的微型语言。正则表达式在查询、替换字符串的时候有很多快速的使用场景,是一个经常使用的工具。正则表达式需要使用到正则表达式的语法,这个语法是独立于编程语言外的一个工具。这个可以 在线查看和测试菜鸟学习教程在线测试工具。

洪源兄 1879

C++ 中的正则表达式 Regex

注:下文所有内容仅仅适用于C++ 2011的新标准,相关编译环境为VS2010。 首先简单列举一下Regex表达式中的一些语法元素: . 通配符,可匹配任何字符。 [] 匹配中括号中的任何字符。 \d 匹配所有数字字符。即:[0-9] \D 匹配所有非数字字符。即:[^0-9] \s 匹配所有空字符。 \w 匹配

cenmengqi的专栏 5856

正则表达式可视化工具regex-vis

regex-vis.com 是一个辅助学习、编写和验证正则表达式的工具。

wbsu2004的博客 9873

c++ regex 正则表达式使用

文章目录概述正则表达式库例子 概述 正则表达式是在c++11之后才被支持,叫正则表达式库。 使用的时候要包含&lt;regex&gt;头文件 正则表达式库 正则表达式有3个主要的算法 regex_match regex_search regex_replace 既然出现在c++11版本,那么迭代器这一重要的特性肯定也是要有的 regex_iterator regex_token_it...

一只懒虫的博客 4814
上一篇: Ubuntu in VMware的问题
下一篇: gtkmm4文件浏览对话框
Computer_Tech
博客等级 码龄3年 573粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值