[正则表达式]PCRE环视功能
设想一下这个问题,假设为了方便长串数字的阅读性,需要为其添加逗号作为分隔,需要怎么做呢?
2569836495 =》 2,569,836,495
正则表达式的匹配通常是从左往右的,这导致无法使用类似[\d]{3}这样的方法去解决问题,因为数字是从右边结算的
用s/([\d]{3})/$1,/g处理上面的数字,只会得到这样的结果
2569836495 =》 256,983,649,5
显然这是错误的标记方法
幸好PCRE提供了[顺序环视],和[逆序环视]功能
[顺序环视]:(?=REG),例如(?=\d),将会匹配右边符合\d条件的位置。
[逆序环视]:(?<=REG),例如(?<=\d),将会匹配左边符合\d条件的位置。
注意:两个匹配方式都强调了“位置”二字,因为环视匹配模式,只匹配位置。
这个例子说明一下:
现有字符串:"SELECT * FROM",匹配表达式:(?=SELECT)
表达式的意思是,匹配满足括号内的条件(这里是SELECT)的字符的左边位置
结果将会是这样:"[我是位置,我被匹配了]SELECT * FROM"
还不能理解的话,继续修改一下表达式:(?=SELECT)SEL
此时红色字体部分被匹配了,"SELECT * FROM"
解析一下:(?=SELECT)匹配了"[我是位置,我被匹配了]SELECT * FROM",接下来从这个位置开始,需要紧接着SEL,于是"SELECT * FROM"被匹配了。
而逆序环视也是差不多的原理,只不过匹配方式是从左起
还是使用刚才的字符串:"SELECT * FROM",匹配表达式:(?<=SELECT)
表达式的意思是,匹配满足括号内的条件(这里是SELECT)的字符的右边位置
结果将会是这样:"SELECT[我是位置,我被匹配了] * FROM"
还不能理解的话,继续修改一下表达式:ECT(?<=SELECT)
此时红色字体部分被匹配了,"SELECT * FROM"
解析一下:ECT首先是要被匹配的,接下来必须紧接着匹配SELECT的右边位置才能完成整个匹配。
再来一个结合了顺序和逆序环视的例子:(?<=SELECT).*(?=FROM)
结果是SELECT和FROM之间的字符被匹配了,"SELECT * FROM",注意结果是包括的空格哦,没显示红色部分是因为空格标注不了红色。。。
好了,完成文章开头给出的问题:右侧必须是数字(?<=\d),左侧必须是连贯的3个数字的倍数并且以这样的方式结束的字符(?=(?:[\d]{3})+\b)
连贯起来就是这样的位置(?<=\d)(?=(?:[\d]{3})+\b)
如果不能理解,回头看多几遍介绍,一定会明白的。
明白了上面两种语法,接下来的环视否定就可以很容易理解了
[顺序环视否定]:(?!REG),例如(?!\d),将会匹配右边符合除\d条件的位置。
[逆序环视否定]:(?<!REG),例如(?<!\d),将会匹配左边符合除\d条件的位置。
[正则表达式]PCRE环视功能的更多相关文章
- PHP 正则表达式(PCRE)
PHP 正则表达式(PCRE) 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串 ...
- Java基础知识强化78:正则表达式之获取功能(案例)
1. 获取下面这个字符串中由三个字符组成的单词. da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? 2. ...
- Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)
1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: package cn.itcast_05; import java.util.regex.Matcher; impor ...
- Java基础知识强化76:正则表达式之替换功能
1. 替换功能: String类的replaceAll方法,如下: public String replaceAll(String regex, String replacement): 使用给定的r ...
- Java基础知识强化73:正则表达式之分割功能
1. 分割功能: 使用String的split方法,split方法:根据给定正则表达式的匹配拆分字符串.如下: public String[] split(String regex): 2. 案例: ...
- js 正则表达式之环视结构
一.环视 1:环视不“占用”字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正 ...
- [正则表达式]PCRE反向分组引用
在常见的文本匹配场景上,经常会需要用到一些像HTML这样的嵌套标签类型的文本匹配,经过多翻折腾,拼凑出了这样的一条语句 (<([\w]+)>((?1)|[\w\s])*</\2> ...
- Java基础知识强化74:正则表达式之分割功能 (扩展练习)
1. 看程序写结果:(面试题考过) package cn.itcast_03; /* * 分割功能练习 */ public class RegexDemo2 { public static void ...
- Java基础知识强化72:正则表达式之判断功能(手机号码判断 和 校验邮箱)
1. 判断功能: 使用了String类的matches方法,如下: public boolean matches(String regex): 2. 判断手机号码的案例: package cn.it ...
随机推荐
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- Java实现多种方式的http数据抓取
前言: 时下互联网第一波的浪潮已消逝,随着而来的基于万千数据的物联网时代,因而数据成为企业的重要战略资源之一.基于数据抓取技术,本文介绍了java相关抓取工具,并附上demo源码供感兴趣的朋友测试! ...
- java学习笔记之线程1
1.线程的概念 线程是系统中最小的执行单元,同一进程有多个线程,多个线程共享进程的资源. 线程调用yield()方法使线程从运行状态转入可运行状态,让出资源: 线程调用sleep()方法使线程由运行状 ...
- 认真研究一下Gradients css3(无聊笔记)(原)
渐变(gradients)分为2种: 线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向 径向渐变(Radial Gradients)- 由它们的中心定义 红色框表示可重 ...
- druid连接池获取不到连接的一种情况
数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...
- java集合类深入分析之Queue篇
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- python面向对象二
1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...
- sql语句,order by
ORDER BY子句必须出现在SELECT中的最后一个子句. 在排序的列中NULL值被认为是最大的. 在SQL语句中给表达式定义别名是一个好习惯. 多列排序时不管升序还是降序,每个列需要单独设置
- redis 操作string 的测试
1>set set name zhangsan :OK get name: zhangsan set name lisi:OK get name: lisi 2> setnx 如果存 ...
- JQuery选择器JQuery 事件
JQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...