巧解正则表达式环视

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

类型 正则表达式 匹配成功条件
肯定逆序环视 (?<=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万元

时间: 2024-12-25 02:20:35

巧解正则表达式环视的相关文章

深入理解正则表达式环视的概念与用法

在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的概念与用法 一.环视的概念 (一)环视概念与匹配过程示例 示例一:简单环视匹配过程 (二)什么是消耗正则的匹配字符? 示例二:一次匹配消耗匹配字符匹配过程 示例三:多次匹配消耗匹配字符匹配过程 二.环视的类型 (一)肯定和否定 (二)顺序和逆序 · 两种类型名称组合 · 四种组合的用法 四种组合正则与环视的摆

详解正则表达式以及文本处理工具&mdash;grep、egrep的用法和特性

一.grep (1)grep简介 grep:全称是Global search REgular expression and Print out the line,全局搜索正则表达式并输出合适的行. grep是一种强大的文本搜索工具,根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,显示能匹配到的行.(只对文本进行搜索处理) Unix的grep家族包含grep.egrep和fgrep. (2)grep的用法 语法格式:grep [option]... 'PATTERN' FILE... 选

[奇淫怪巧] 利用正则表达式判断素数

最近在学习正则表达式,偶然间看到利用正则表达式判断一个数是不是素数的帖子.当时就震惊了,觉得好神奇.那个判断素数的函数是这样子的: public static bool IsPrime(int i) { return !Regex.IsMatch(new String('*', i), "^.?$|^(..+?)\\1+$"); } 有没有觉得很神奇?我当时就觉得相当的有想象力的一种实现.那让我们看一下这个正则表达式是如何做判断素数的. 第一步,创建了一个长度为i,并以'*'填充的字符

详解正则表达式(re) 一

详解正则表达式(re) 一 research 查找文本中的模式compile 编译findall 查询所有匹配重复与贪婪 re 正则表达式 可以用形式化的语法描述文本匹配模式,模式又被正则表达式引擎编译成指令:执行指令并提供一个字符串作为输入,就可以知道给定的输入有没有与模式相匹配. 文字比较空洞还是直接看例子吧. search 查找文本中的模式 查找一段文本中有没有出现 sql 这个字符串. In [1]: s ="I like sql" In [2]: 'sql' in s Out

Sed 命令详解 正则表达式元字符

1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上.sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示.处理完输入文件的最后一行后,sed便结束运行.sed把每一行都存在临时缓冲区中,对这个副本进行编辑,

链表的巧解

直观地想,如果想得到倒数第k 个节点,那么从后面往前数k个啰?这个不行,单向链表 是行不通的,那么也可以这样,设有n个节点,那么向前往后数n-k+1个吧.但是这种方法 要两次遍历链表,第一次是获得链表节点的个数n.第二次才找到倒数第k个节点. 比较巧的方法是: 设两个指针,一个指各头,另一个与前一个指针相隔k-1个节点,则当后面那个指针 指向尾的时候,前面那个就指向了倒数第k个节点了. 注意代码的鲁棒性: #ifndef COUNT_BACKWARD_H #define COUNT_BACKWA

JavaScript系列文章:详解正则表达式之二

在上一篇文章中我们讲了正则表达式的基本用法,接下来博主想聊聊其中的细节,今天就从正则修饰符开始吧. 正则修饰符又称为正则标记(flags),它会对正则的匹配规则做限定,进而影响匹配的最终结果.在上次的文章中我们也提到过,正则修饰符一共有以下几种,可以单独使用,也可以组合使用: /\w+/g; // global search /\w+/i; // ignore case /\w+/m; // multi-line /\w+/u; // unicode /\w+/y; // sticky /\w+

正则表达式环视

4种环视 顺序肯定环视(?=pattern) 逆序肯定环视(?<=pattern) 顺序否定环视(?!pattern) 逆序否定环视(?!<pattern) 注意 环视是不会占用物理匹配的 顺序肯定环视的2种用法 环视在左表达式在右:二次筛选匹配 表达式在右环视在左:以表达式环视结尾 如:字符aa1235206894  (?\S{6})\d{2} 环视匹配前6位任意字符 右侧表达式再根据左侧环视匹配的结果再进行匹配 最终匹配1 \d+(?=94) 匹配任意数字字母开头 环视表达式94为结尾 结

iOS开发之详解正则表达式

本文由Charles翻自raywenderlich原文:NSRegularExpression Tutorial: Getting Started更新提示:本教程被James Frost更新到了iOS8和swift.Tutorial团队成员的Soheil Azarpour完成最初发布.正则表达式(广为所知的"regex")是一个字符串或一个字符序列来说明一种模式,把它作为一个搜索字符串-非常强大! 在一个文本编辑器或文字处理器中普通的旧式搜索只允许你进行简单的匹配.正则表达式可以实现这