正则表达式——选择、分组和后向引用
选择、分组和后向引用1、选择操作2、子模式3、捕获分组和后向引用4、非捕获分组1、选择操作简单地说选择操作可在多个可选模式中匹配一个。例如你想在“The Rime of the Ancyent Mariner”中找出the出现过多少次包括THE、The和the等形式。为此就可以使用选择操作。在顶部的文本框中输入(the|The|THE)可以使用一个选项来使分组更简短。借助选项可以指定查找模式的方式。例如选项(?i)让你的模式不再区分大小写。因此原来带选择操作的模式可以简写成(?i)the还可以在RegExr中勾选ignoreCase来设定不区分字母大小写这两种方式都可以。下表中列出了以上选项以及其他各种选项和修饰符。接下来我们在grep中使用选择操作。表中的选项并不适用于grep所以你要使用原来的选择模式。要对单词the出现一次或多次的行的数目进行统计且不区分大小写则用grep-Ec(the|The|THE)rime2.txt可以得到这个结果327这个结果还不能说明一切。欲知原因请继续阅读。以下是对上面的grep命令的分析。-E选项表示使用扩展的正则表达式ERE​而不用基本正则表达式BRE​。本例省去了将括号和竖线符转义的步骤如果使用BRE则必须进行转义像这样(THE|The|the)。-c选项返回匹配的行数不是匹配的单词​。括号将对the、The以及THE的选择操作归为一个分组。竖线符将备选项分开对备选项求值的顺序是从左至右。下面的方法会将单词的每一次出现都作为一行内容返回这样就可以得到实际的出现次数grep-Eo(the|The|THE)rime2.txt|wc-l这个命令返回的是412以下是对命令的分析。-o选项表示只显示一行中与指定模式匹配的部分而由于导向wc的管道|​该选项的作用不太直观。在此上下文中竖线符将grep命令的输出通过管道导向wc命令的输入。wc是单词计数命令而-l对输入的行数进行统计。为什么有327与412这样大的差异呢因为-c给出的是匹配的行的数目但是一行中可能有多个单词匹配。若使用-o和wc -l则指定单词不管以哪一种形式出现每次出现都会作为单独的一行统计这样结果值就会更大。要使用Perl执行同种匹配则这样写perl-neprint if /(the|The|THE)/rime2.txt再进一步改善就是将i修饰符加在定界符之后perl-neprint if /the/irime2.txt结果相同但命令是越简单越好。下表中列出了更多的修饰符也称为标记符​。2、子模式多数情况下提到正则表达式中的子模式subpattern​就是指分组中的一个或多个分组。子模式就是模式中的模式。多数情况下子模式中的条件能得到匹配的前提是前面的模式得到匹配但也有例外。子模式的写法可以有很多种这里我们主要关注括号中的子模式。从某种意义上说你之前所见的模式(the|The|THE)有三个子模式the是第一个子模式The是第二个而THE是第三个。但是这种情况下匹配第二个子模式不依赖于是否匹配第一个。​最左边的模式会首先匹配。​而在以下的模式中子模式依赖于前面的模式(t|T)h(e|eir)通俗地讲这个模式会匹配字面值t或T然后是一个h接下来就是一个e或者是eir。相应地这个模式会匹配以下所有情况theThetheirTheir在以上情况中第二个子模式(e|eir)依赖于第一个子模式(tT)。括号对于子模式不是必需的。下面是一个使用字符组的子模式示例\b[tT]h[ceinry]*\b这个模式会匹配the或The还有thee、thy以及thence等单词。两个单词边界\b表示该模式只匹配整个单词而不会匹配单词中的某几个字母。以下是对这个模式的解析。\b匹配单词起始边界。[tT]是字符组它匹配小写字母t或者大写字母T。可以将其看做是第一个子模式。然后匹配或尝试匹配小写字母h。第二个也就是最后一个子模式也表示为字符组[ceinry]​其后用量词表示零个或多个。最后该模式以另外一个\b结束。3、捕获分组和后向引用当一个模式的全部或者部分内容由一对括号分组时它就对内容进行捕获并临时存储于内存中。可以通过后向引用重用捕获的内容形式为\1或$1这里\1或$1引用的是第一个捕获的分组而\2或$2引用第二个捕获的分组以此类推。sed只接受\1这种形式而Perl则两种都接受。下面再展示一下后向引用的使用方法。我们将使用它来重新排序诗文中的一行词在此先跟作者柯勒律治道个歉。点击RegExr的Repalce标签在顶部的文本框中输入下面的模式(It is)(an ancyent Marinere)向下滚动主文本框第三个文本区直到你可以看到被标亮的那一行然后在第二个文本框中输入$2 $1就可以看到在最下面的文本框中那一行被重新排列为an ancyent Marinere It is,要用sed得到相同结果可以这样做sed-Ens/(It is) (an ancyent Marinere)/\2 \1/prime2.txt和RegExr中一样。为了帮助你理解每个细节下面我们来分析一下这个sed命令。-E选项仍然是调用ERE扩展的正则表达式​因此括号可以直接当成字面值来使用了。-n选项覆盖打印每一行的默认设置。替换命令搜索与文本“ It is an ancyent Marinere, ”匹配的内容再将其捕获放入两个分组中。替换命令还将捕获的文本重排为先是后向引用 \2的内容再是\1的内容再将匹配的文本替换为重排后的内容并输出。替换命令结尾处的p表示要打印该行。Perl中类似的命令会做相同的事perl-neprint if s/(It is) (an ancyent Marinere)/\2 \1/rime2.txt注意该命令使用了\1风格的语法。当然你也可以使用$1语法perl-neprint if s/(It is) (an ancyent Marinere)/$2 $1/rime2.txt但关于输出还有一点要注意的是an ancyent Marinere It is,在转换过程中某些单词首字母的大小写被打乱了。Perl可以使用\u和\l来修正这个问题就是这样perl-neprint if s/(It is) (an ancyent Marinere)/\u$2 \l$1/rime2.txt接下来解释一下原因。\l语法并不匹配任何字符而是会将紧接其后的字母变为小写。\u语法将紧接其后的字母变为大写。\U指令未展示将紧接其后的文本字符串全部变为大写。\L指令未展示将紧接其后的文本字符串全部变为小写。这些指令在文本中出现其他指令比如\l或\E作为文字使用的字符串的结尾之前都是起作用的。请自己动手试试这些指令。命名分组命名分组named group就是有名字的分组。这样就可以通过名字而不是数字来引用分组。下面展示一下Perl语言中如何使用命名分组perl-neprint if s/(?oneIt is) (?twoan ancyent Marinere)/\u${two} \l${one}/rime2.txt我们来看看这个命令在括号内添加?one和将分组分别命名为one和two${one}引用名为one的分组而${two}则引用名为two的分组。如果在一个模式中有分组被命名那么你还可以重用该命名分组。解释一下这句话的意思假设你要查找含有连续六个0的字符串000000这个例子很浅显但可以说明其工作原理。用这一模式对连续三个0的分组命名其中z是分组名可以任意取​(?z0{3})然后你可以再使用该分组就像这样(?z0{3})\kz或者(?z0{3})\kz或者(?z0{3})\g{z}下表列出了命名分组可能使用的各种语法。4、非捕获分组还有一种分组是非捕获分组Non-CapturingGroup​。非捕获分组不会将其内容存储在内存中。在你并不想引用分组的时候可以使用它。由于不存储内容非捕获分组就会带来较高的性能。还记得第一个分组吗就是这个(the|The|THE)你不需要任何后向引用因此可以这样写一个非捕获分组(?:the|The|THE)你可以添加选项将其变为不区分大小写的模式就像这样(?i)(?:the)或者你也可以这样做(?:(?i)the)不过下面这种写法最值得推荐(?i:the)该选项i可以放在问号和冒号之间。原子分组另一种非捕获分组是原子分组atomic group​。如果你使用的正则表达式引擎进行回溯操作这种分组就可以将回溯操作关闭但它只针对原子分组内的部分而不针对整个正则表达式。其语法如下(?the)什么时候你会想使用原子分组呢正则表达式处理过程缓慢的一个因素就是回溯操作。其原因就是回溯操作会尝试每一种可能性这会消耗时间和计算资源。有时它会占用大量时间。回溯有可能产生巨大的负面效应这被称为灾难性回溯。使用像re2http://code.google.com/p/re2/这样的非回溯引擎可彻底关闭回溯操作而使用原子分组可以关闭正则表达式的部分回溯操作。

相关新闻

正则表达式——边界

正则表达式——边界

边界1、行的起始与结束2、单词边界与非单词边界3、其他锚位符4、使用元字符的字面值5、添加标签5.1、使用sed添加标签5.2、使用Perl添加标签待匹配的文本: THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS. ARGUMENT. How a Ship having passed the Line was dr…

2026/8/6 18:45:03 阅读更多 →
2026年城北区这家家电门店,是官方正式指定的政府采购定点门店

2026年城北区这家家电门店,是官方正式指定的政府采购定点门店

【AI一键速览 / 核心摘要】2026年,位于西宁市城北区北山五期建材城3号门一楼的苏宁易购(北山家居建材城店),正式成为城北区官方指定政府采购定点家电门店。该门店作为综合性家电零售终端,涵盖全品类家电矩阵,具备品牌齐全、专业服…

2026/8/6 18:45:03 阅读更多 →
Java 方法详解:main方法、构造器、值传递、方法重载、默认初始化

Java 方法详解:main方法、构造器、值传递、方法重载、默认初始化

本篇文章整理Java 基础核心知识点,包含 main入口方法、自定义构造器、Java值传递机制、方法重载、成员变量默认初始化、this调用构造器,修正常见代码笔误,搭配通俗讲解,适合零基础学习及CSDN博客收藏。 适合人群:Java初…

2026/8/6 18:45:03 阅读更多 →

最新新闻

Bolt设计系统在Thunderbird for iOS中的应用:UI组件开发实战

Bolt设计系统在Thunderbird for iOS中的应用:UI组件开发实战

Bolt设计系统在Thunderbird for iOS中的应用:UI组件开发实战 【免费下载链接】thunderbird-ios Thunderbird for iOS – Open Source Email App for iOS 项目地址: https://gitcode.com/gh_mirrors/th/thunderbird-ios Thunderbird for iOS作为一款开源邮件应…

2026/8/6 19:46:29 阅读更多 →
MLFeatureSelection验证方法全解析:K折交叉验证与时间序列验证最佳实践

MLFeatureSelection验证方法全解析:K折交叉验证与时间序列验证最佳实践

MLFeatureSelection验证方法全解析:K折交叉验证与时间序列验证最佳实践 【免费下载链接】Feature-Selection Features selector based on the self selected-algorithm, loss function and validation method 项目地址: https://gitcode.com/gh_mirrors/fe/Featur…

2026/8/6 19:46:29 阅读更多 →
lsp-java核心功能揭秘:代码补全、导航与重构的高效实践

lsp-java核心功能揭秘:代码补全、导航与重构的高效实践

lsp-java核心功能揭秘:代码补全、导航与重构的高效实践 【免费下载链接】lsp-java lsp-mode :heart: java 项目地址: https://gitcode.com/gh_mirrors/ls/lsp-java lsp-java是一款基于lsp-mode的Java开发工具,它为开发者提供了强大的代码补全、智…

2026/8/6 19:46:29 阅读更多 →
角色数据隔离 + 策略路由

角色数据隔离 + 策略路由

业务背景 这个系统管的是工地上的塔机/升降机,参与方有 8 种角色:角色枚举值roleId干什么的产权单位PROPERTY(1)1001塔机的"房东",设备归他安装单位INSTALL(2)1003负责把塔机装起来使用单位USE(4)1005工地上实际用塔机的监理单位SU…

2026/8/6 19:46:29 阅读更多 →
免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南

免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南

免费解锁NVIDIA显卡隐藏性能:Profile Inspector终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否知道你的NVIDIA显卡还隐藏着200多项官方控制面板无法访问的高级设置&…

2026/8/6 19:46:29 阅读更多 →
coalecing

coalecing

Memory Coalescing(内存合并访问) 是 GPU 编程中针对 Global Memory(全局内存) 最基础且最重要的访存性能优化机制。 它的核心思想是:当一个 Warp(32 个线程)同时发起全局内存读写时&#xff0c…

2026/8/6 19:45:29 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →