读书笔记《Mastering Regular Expressions》(四)

Mastering Regular Expressions.pdf 立即下载
MasteringRegEx
一、问题

将一个数值字串,从右向左,每三位用逗号分开,比如,将“123456789”替换为“123,456,789”。

二、分析

替换算法的本质是将字串从右向左,每3个字符为一组进行分组,然后在组与组之间插入逗号。

三、语法

正则表达式引入了“预测”和“回顾”这两个概念,它们不是匹配字串,而是匹配一个“位置”,其中预测是正向(自左向右)查看,回顾是反向(自右向左)查看。

(下表中圆括号及其括住的内容,只匹配位置,不匹配文本)
正则表达式名称说明示例
(?=...)预测断言子表达式在此位置的右侧abcd(?=/d)匹配右侧紧跟数字的abcd
(?!...)否定预测断言子表达式不在此位置的右侧abcd(?!/d)匹配右侧紧跟的不是数字的abcd
(?<=...)回顾断言子表达式在此位置的左侧 (?<=/d)abcd匹配左侧是数字的abcd
(?<!...)否定回顾断言子表达式不在此位置的左侧(?<!/d)abcd匹配左侧不是数字的abcd

预测和回顾只是匹配一个位置,其中的子表达式并不被匹配。比如有字符“ABCDEFG”,则正则表达式

(?=EFG)(?<=ABCD)或(?<=ABCD)(?=EFG)

就匹配D与E之间的那个位置,而不是匹配EFG,也不匹配ABCD,或其他任何一个字串。 注意,由于只是断言一个位置,所以上述预测和回顾的先后次序并不重要,二者同样都是匹配D与E之间的那个位置。前者的含义是“匹配一个位置,它的右边是 EFG,左边是ABCD”,后者的含义是“匹配一个位置,它的左边是ABCD,右边是EFG”,两者都是同一个意思。下面的Perl在ABCD和EFG之 间插入一个逗号:

$foo = "ABCDEFG";
$foo =~ s/(?<=ABCD)(?=EFG)/,/;
print $foo;

假定要把某段文本中所有的Jeffs都替换为Jeff's(匹配到单词边界),那么,就会有如下几种方案:

方案
说明
s//bJeffs/b/Jeff's/g这是最直观的方法,直接把匹配到的Jeffs替换为Jeff's
s//b(Jeff)(s)/b/$1'$2/g分组构造,在两个组之间插入单引号
s//bJeff(?=s/b)/Jeff'/g预测,仅匹配“后面紧跟s并在单词边界的Jeff”的右侧那个位置
(其它的如Jeffrey中的Jeff不被匹配)
s/(?<=/bJeff)(?=s/b)/'/g同时使用预测和回顾,在匹配位置处插入单引号
s/(?=s/b)(?<=/bJeff)/'/g与上面的行为完全相同,由于预测和回顾只是匹配位置而不是匹配字串,所以先后次序不重要了。
四、解决问题

利用预测和回顾,就可以解决“在数值中插入逗号”的问题了。插入算法是:从右向左把数字,每3个分为一组,在组与组之间插入逗号。也就是说,只要匹配到这些位置,就可以在这些位置上插入逗号。

$foo = "123456789";
$foo =~ s/(?=/d/d/d)/,/g;
print $foo;

上面的结果是“,1,2,3,4,5,6,789”,显然不是想要的。

正则表达式结果说明
s/(?=/d/d/d)/,/g
s/(?=(/d/d/d)+)/,/g
,1,2,3,4,5,6,7891左边的位置被匹配,因为该位置右边有3个数字(123)
同理,1右边的位置也被匹配,该位置右边有3个数字(234)……
而7的右边位置不再被匹配,因为该位置右边不再有3个数字
s/(?=/d/d/d$)/,/g123456,789只有7左边的位置被匹配,因为该点符合以下两个条件:
其右边是3个数字,
且这3个数字在行尾(其右侧什么也没有了)。
s/(?=(/d/d/d)+$)/,/g,123,456,7891左边的位置符合条件“其右侧有N组(每组3个数字),且最后一组在行尾”;
2左边的位置不符合该条件,因为其后面是234、567和89,最后的89无法构成一组;
其它同理……
s/(?=(/d/d/d)+$)(?<=/d)/,/g123,456,7891左边的位置不再被匹配,因为(?<=/d)的存在,它指示该位置的左侧必须是数字,
而1左边的位置显然不符合。

这个正则表达式替换单个的数字串没问题,但如果想要将“The population of 281421906 is growing”中的281421906替换成281,421,906就无能为力了,原因是$限定了最后一组(3个)数字必须在行尾,因此需要把条件修正为“最后一组数字的右边不是数字”,这就要用到“否定预测”:

s/(?=(/d/d/d)+(?!/d))(?<=/d)/,/g

(微软VBScript.DLL提供的COM对象IRegExp2,文档里说支持“回顾”语法,但实际运用却会抛出一个异常,不知何故)

 
Mastering-Python-Regular-Expressions:精通Python正则表达式 Mastering-Python-Regular-Expressions 精通Python正则表达式 立即下载

相关推荐

Mastering Regular Expressions(3rd) 无水印pdf

Mastering Regular Expressions(3rd) 英文无水印pdf 第3版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

精通正则表达式( Mastering Regular Expressions) [Third Edition]

读者最好能养成按照字符来理解正则表达式的习惯.(p.8) 如果连字符出现在字符组的开头, 他表示的就是一个普通字符, 而不是一个范围. 同样的道理, 问号和点号通常被当作元字符处理, 但在字符组中则不是如此(说明白一点就是, [0-9A-Z_!.?]里面, 真正的特殊字符只有那两个连字符).(p.9) 请记住, 排除行字符组表示"匹配一个未列出的字符(match a cha...

weixin_30776863的博客 267

中文版Mastering Regular Expressions(第三版)

随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。本书是讲解正则表达式的经典之作。本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。中文版更方便阅读。

匹配IP字串、域名的正则表达式

读了几页《Mastering Regular Expression》,有心想写一个能够匹配IP字串的正则表达式,实际尝试发现远没有自己写几行代码来判断来得容易,呵呵。一个IP字串,由四段组成,每一段是0~255的数字,段与段之间用小数点隔开,比如61.139.2.69就是一个合法的IP字串。如果正则表达式写成/d{1,3}(/./d{1,3}){3}无疑是不负责的,因为它可以匹配300.4

于无声处 2万+

MasteringRegularExpressions3rdEdition.pdf 英文原版

Mastering Regular Expressions 3rd Edition

Mastering Regular Expressions

Mastering Regular Expressions,已经有中文版了

读书笔记《Mastering Regular Expressions》(一)

Mastering Regular ExpressionsJerffrey E.F.Friedl著的这本书,闻名已久。九月份从当当网邮购了一本,却一直没有时间坚持读,主要原因当然还是英文差,没有养成阅读英文的习惯和能力。后悔呀,当初为什么不多花点时间在英语上面。开篇说的那个可怕的、查找重复单词的需求非常生动,如果是我遇到这样的需求,肯定同样会很苦恼。 检查N个文件,

于无声处 2132

UE5 Decal混合进阶:如何用DBuffer实现自定义Normal插值(附完整材质配置流程)

本文深入解析了UE5中利用DBuffer技术实现Decal自定义Normal插值的完整流程。通过详细的材质配置步骤和核心算法说明,帮助开发者突破传统混合模式限制,掌握高级法线控制技巧,特别适合需要精细环境细节的3A级项目开发。

table的专栏 224

整理笔记——正则表达式总结

本文参考书籍:《Mastering Regular Expressions,3rd Edition》Jeffrey E.F Friedl 著,余晟 译,中文名《精通正则表达式》 关于正则表达式 正则表达式术语 正则(regex) 正则表达式regular expression的简写,全称念起来麻烦,合成了这个regex简称。正则表达式是强大、便捷、高效的文本处理工具。实际上,我们最常见的应

BlueBee与码小姐的故事 1331

避坑指南:STM32F4的ADC采样FSR传感器,如何稳定读数并校准压力值?

本文详细解析了STM32F4的ADC采样FSR薄膜压力传感器时遇到的读数不稳定和非线性校准问题,提供了从硬件配置到软件滤波的完整解决方案。通过优化ADC设置、改进滤波算法和实施分段线性校准,帮助工程师实现高精度压力测量,特别适用于智能手套和医疗监测等应用场景。

weixin_28675839的博客 273

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6026

读《Mastering Regular Expressions》

以前一直觉得正则表达式不过是programming中的一个辅助工具而已,但是最近花了几天时间阅读了Jeffrey的《Mastering Regular Expressions》,读完以后才感觉到正则表达式如此的充满魅力,就像Alice从兔子洞看到了神奇的地底世界一样,我也看到了一个神奇的正则表达式的世界。 说到正则表达式的历史,书中有介绍到,它最初的构想源自20世纪40年...

weixin_30603633的博客 130

CCS导入工程报错?手把手教你安装C2000编译器(附最新下载链接)

本文详细解析CCS导入工程报错的常见原因,并提供三种安装C2000编译器的解决方案(TI官网离线安装、CCS内置更新和App Center渠道)。通过版本匹配技巧和路径配置要点,帮助开发者快速解决编译器缺失问题,确保项目顺利导入和编译。

weixin_30374009的博客 662

读书笔记《Mastering Regular Expressions》(三)

一、Non-Capturing这个Non-Capturing的确不知道该如何翻译(非捕获?),但意思是明白了。用圆括号括起来的部分可以被捕获到$1、$2……中,但如果起始圆括号后面紧跟一个问号和冒号,就表示本组不需要被捕获到$1、$2……中。例如,下列正则表达式中^([-+]?/d+(/./d*)?)([CF])$ 第1个被捕获的组:从第一个左圆括号,到与该左圆括号配对的

于无声处 1942

定位教程0---定位初介绍

定位教程0---定位算子介绍

Quintin 1万+

EZ-INSAR工具箱(使用历史问题)

把 rasterio 升到 1.3+(或退回 py39)→features能 import → 脚本能跑 → 出图 → MATLAB 不再报错!

2301_79258000的博客 121

读书笔记《Mastering Regular Expressions》(二)

圆括号圆括号有两种用法 将“或”操作(“|“符号)的两个值括起来,比如(ABC|abc) 将多个字符括起来做为一个整体,使之可以用?、+、* 或{m,n}来限定该整体的匹配次数反向引用当被圆括号括住的整体被匹配时,该匹配能够被正则表达式工具记住,并由/1、/2、/3……来引用第一个、第二个、第三个……匹配。例如,本书开篇所讲的那个找出重复单词的例子,可以由如

于无声处 1981

企业如何开展BI建设--指标体系建设

很多企业的数字化转型工作都是从做BI项目开始的,很多企业认为,BI就是做指标大屏,所以做了很多的驾驶舱,也做了很多指标,有从系统取的,有手工填报的,甚至手工填报的比例占到了70%,最终BI沦为了填报系统,业务认为BI就是把从线下的微信沟通转到了线上录入展示,并没有给业务代来任何提升,久而久之,BI大屏就没人关心,公司高层也认为数据都是填报的,都经过了加工处理,这种数据不可信,不能反映业务开展的实际。其实在BI系统建设之前,我们首先要做的就是要梳理企业的指标,到底我们要展示哪些指标?

263

读书笔记《Mastering Regular Expressions》(一) 完整域名的正则表达式

读了几页《Mastering Regular Expression》,有心想写一个能够匹配IP字串的正则表达式,实际尝试发现远没有自己写几行代码来判断来得容易,呵呵。一个IP字串,由四段组成,每一段是0~255的数字,段与段之间用小数点隔开,比如61.139.2.69就是一个合法的IP字串。如果正则表达式写成/d{1,3}(/./d{1,3}){3}无疑是不负责的,因为它可以匹配300.4

ssihc0的专栏 1076

Linux 内核参数:meminfo

内存管理是一个相对复杂的内核模块,错综复杂的数据结构和管理逻辑。Linux 内核为了帮助开发者从宏观上把握内存的使用情况,在几大核心数据结构中都有相应的计数统计,如物理页面使用情况、伙伴系统分配情况、内存管理区的页面使用情况、内存回收扫描回收情况、内存规整触发情况等等。本文要分析的节点meminfo是Linux 操作系统中查看系统内存最准确(meminfo 中有内存黑洞)的方法,它包含当前时刻系统的所有物理页面的信息。

私房菜 2413

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精通正则表达式(第三版)——Mastering Regular Expressions,3rd Edition——读书笔记1...

基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([01]?[0-9])|(2[0-3])):[0-5][0-9]* 浮点数,保留小数点两位,如果第三位不为零,保留第三位:~s/(\.\d\d[1-9]?)\d*/$1/...

weixin_30808693的博客 204

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精通正则表达式(第三版)—Mastering Regular Expressions,3rd Edition—读书笔记2

1.肯定断言:必须匹配一个字符 排除型字符组:匹配未列出字符的字符组 2.范围表示法——列出范围内所有的字符 大多数情况下,不会影响执行速度。但是,某些实现方式不能完全优化字符组。所以,最好是有范围表示法,有可能速度更快。 [a-Z],可能存在遗漏;[a-zA-Z],可以匹配所有字母。 3.点号:在某些软件中,可以匹配任何字符;在其他软件中,匹配处理换行符之外的任何字符。 .* :通常情...

weixin_30546933的博客 140

蓝牙模块HM-10手册

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

再博

再次转移阵地,每天积累一点,还是很可观的。 这个Blog主要用于主题的学习,工作中随记,有用或有趣的软件。 2006年12月(目前)将集中于以下两个方面 1,XML.准备考证IBM XML 2,正则表达式,读书笔记&lt;Mastering regular expression 3rd edition&gt; ...

Tanner 168

[笔记] 精通正则表达式/Mastering Regular Expressions

/ 匹配<emphasis>这个tag标注的IP地址的RE:‘<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>' / 锚定--anchor / 最好能养成按照字符来理解RE的习惯:例如 '^cat',不要理解为匹配以cat开头的行,而应该理解为匹配以c作为一行的第一个字符,紧接一个a,紧接一个t的文本; / '^$'匹配...

weixin_30906185的博客 171

深入掌握正则表达式:MasteringRegularExpressions(3rd)无水印pdf版

深入掌握正则表达式:MasteringRegularExpressions(3rd)无水印pdf版 【下载地址】MasteringRegularExpressions3rd无水印pdf版 《Mastering Regular Expressions(第3版)》是一本深入探讨正则表达式的经典英文原版书籍,适合希望精进编程技...

gitblog_06737的博客 1170

Mastering Regular Expressions 知识点总结(持续更行中,图片剪切)

GRC 1164
上一篇: 反转数
下一篇: 避免多次触发Page_Load
SeaWave
博客等级 码龄27年 117粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值