巧解正则表达式环视

简介:

正则表达式匹配主要有两种,匹配字符和匹配位置。环视我个人理解应该更像是匹配位置的。具体下文说到。下面先看一下环视的正则表达式书写格式。

类型 正则表达式 匹配成功条件
肯定逆序环视 (?<=expresion) 子表达式能够匹配左侧文本
否定逆序环视 (?<!expresion) 子表达式不能匹配左侧文本
肯定顺序环视 (?=expresion) 子表达式能够匹配右侧文本
否定顺序环视 (?!expresion) 字表达式不能匹配右侧文本

 

 

 

 

本表摘自《精通正则表达式》p66

 

你要是觉得我会按照上面的表格来理解你就错了,看完上面的表格我是一脸懵逼的,用的时候更加会一脸懵逼,然后把书本中p66页前面的几页再翻了几遍,发现一段很重要的话,顺序环视会检查子表达式能否匹配,但它只寻找能够匹配的位置,而不会真正“占用”这些字符。好了,大家赶紧画重点,考试要考,它只寻找能够匹配的位置,也就是说环视只是匹配位置,而不是匹配文本,匹配位置最常见的就是^和$,指匹配文本的开头和结尾,然后把上面的表格再转换一下就是

 

类型 正则表达式 匹配成功条件
肯定逆序环视 (?<=expresion) 匹配子表达式右侧的位置
否定逆序环视 (?<!expresion) 匹配非子表达式右侧的位置
肯定顺序环视 (?=expresion) 匹配子表达式左侧的位置
否定顺序环视 (?!expresion) 匹配非子表达式左侧的位置

 

 

 

 

 

 单单看这个表还是有点一脸懵逼,那就来举几个栗子。玩正则表达式推荐你们一个利器,简直能称为神器,RegexBuddy,是《精通正则表达式》中介绍的。下面的例子我都是用他来完成。

1、(?=\d)

可以理解为匹配数字左边的位置,然后把匹配到的位置替换为逗号,结果如图,图中左上角为正则表达式和替换字符串,右下角为匹配的文本和替换的结果

看图中右下角高亮的逗号,就是之前的匹配的位置。

2、(?!\b)

匹配非数字左边的位置,然后把这些匹配的位置替换为逗号,结果如图

 对比1和2的两个图你就会发现(?=\b)和(?!\b)是互补的关系,两个表达式匹配的位置合起来就是该匹配的文本的所有位置。

3、书中例子完善

《精通正则表达式》书中环视用了一个例子来贯通。该例子也比较常用,就是对于比较大的数值,我们一般在其中间加入逗号,这样才能更容易看懂,如112347915如果写成112,347,915就会比较清晰一点。

下面我将一步步说明如何把“今年的营业额为112347915.5465万元”替换为“今年的营业额为112,347,915.5465万元”

a、要替换的位置在数字的左边

正则表达式:(?=\d)

替换结果:今年的营业额为,1,1,2,3,4,7,9,1,5.,5,4,6,5万元

b、要替换的位置右边至少有三个数字,也就是位置是在三个数字左边

正则表达式:(?=\d\d\d)

替换结果:今年的营业额为,1,1,2,3,4,7,915.,5,465万元

c、要匹配的位置左边应该有数字,也就是该位置应该是在数字的右边

正则表达式:(?<=\d)(?=\d\d\d)

替换结果:今年的营业额为1,1,2,3,4,7,915.5,465万元

d、匹配位置的时候需要没隔三个数字进行匹配,这时候就要用到量词"+"了

正则表达式:(?<=\d)(?=(\d\d\d)+(?!\d))

替换结果:今年的营业额为112,347,915.5,465万元

其中(?=(\d\d\d)+(?!\d))的意思就是指匹配一个位置,该位置是在(\d\d\d)+(?!\d)的左边,也就是该位置是在一个非数字的左边的每三个数字的左边(囧,有点绕口)。

e、最后排除掉小数点后面的位置,也就是匹配的位置不能是在小数点之后的连续数字中。

正则表达式:(?<=\d)(?<!\.\d+)(?=(\d\d\d)+(?!\d))

替换结果:今年的营业额为112,347,915.5465万元

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1949368如需转载请自行联系原作者


sshpp

相关文章
|
2月前
|
Python
Python实现正则表达式匹配。
【2月更文挑战第11天】【2月更文挑战第30篇】Python实现正则表达式匹配。
|
5月前
|
Java
每日一刷《剑指offer》字符串篇之正则表达式匹配
每日一刷《剑指offer》字符串篇之正则表达式匹配
51 0
每日一刷《剑指offer》字符串篇之正则表达式匹配
|
11月前
每日一题——反转字符串中的单词
每日一题——反转字符串中的单词
|
11月前
|
存储
Leecode 1160. 拼写单词
Leecode 1160. 拼写单词
40 0
|
存储 索引
学懂正则表达式(RegExp)
学懂正则表达式(RegExp)
166 0
学懂正则表达式(RegExp)
|
Web App开发 数据可视化 搜索推荐
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(上)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
186 0
|
算法 Python Perl
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(下)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
157 0
|
搜索推荐 iOS开发 Python
😝 这次一定 | "学废" 正则表达式 🙋‍♂️(中)
正则表达式 → 没有一个开发仔会对这个词陌生吧?没印象的话,想想你是如何 判断身份证、手机号码是否合法的 ?Tips:本节代码示例基于Python的re库编写,虽大部分编程语言的正则库都是师从 Perl语言,语法基本一样,但也可能略有差异~
148 0
|
算法 前端开发 程序员
「LeetCode」剑指Offer-19正则表达式匹配⚡️
「LeetCode」剑指Offer-19正则表达式匹配⚡️
104 0
「LeetCode」剑指Offer-19正则表达式匹配⚡️
|
数据可视化 前端开发 JavaScript
学习正则(第三天)看懂括号
学习正则(第三天)看懂括号
122 0
学习正则(第三天)看懂括号