设想一下这个问题,假设为了方便长串数字的阅读性,需要为其添加逗号作为分隔,需要怎么做呢?

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环视功能的更多相关文章

  1. PHP 正则表达式(PCRE)

    PHP 正则表达式(PCRE) 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串 ...

  2. Java基础知识强化78:正则表达式之获取功能(案例)

    1. 获取下面这个字符串中由三个字符组成的单词. da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? 2. ...

  3. Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)

    1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: package cn.itcast_05; import java.util.regex.Matcher; impor ...

  4. Java基础知识强化76:正则表达式之替换功能

    1. 替换功能: String类的replaceAll方法,如下: public String replaceAll(String regex, String replacement): 使用给定的r ...

  5. Java基础知识强化73:正则表达式之分割功能

    1. 分割功能: 使用String的split方法,split方法:根据给定正则表达式的匹配拆分字符串.如下: public String[] split(String regex): 2.  案例: ...

  6. js 正则表达式之环视结构

    一.环视 1:环视不“占用”字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正 ...

  7. [正则表达式]PCRE反向分组引用

    在常见的文本匹配场景上,经常会需要用到一些像HTML这样的嵌套标签类型的文本匹配,经过多翻折腾,拼凑出了这样的一条语句 (<([\w]+)>((?1)|[\w\s])*</\2> ...

  8. Java基础知识强化74:正则表达式之分割功能 (扩展练习)

    1. 看程序写结果:(面试题考过) package cn.itcast_03; /* * 分割功能练习 */ public class RegexDemo2 { public static void ...

  9. Java基础知识强化72:正则表达式之判断功能(手机号码判断 和 校验邮箱)

    1.  判断功能: 使用了String类的matches方法,如下: public boolean matches(String regex): 2. 判断手机号码的案例: package cn.it ...

随机推荐

  1. vs2017 rc 离线安装包制作

    vs2017 rc 离线安装包制作 1.下载在线安装包:https://aka.ms/vs/15/release/vs_Enterprise.exe 2.制作离线安装包: vs_Enterprise. ...

  2. SSM整合(二):Spring4与Mybatis3整合

    上一节测试好了Mybatis3,接下来整合Spring4! 一.添加spring上下文配置 在src/main/resources/目录下的spring新建spring上下文配置文件applicati ...

  3. MySQL练习题参考答案

    MySQL练习题参考答案 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[ ...

  4. Keepalived的全局配置

    Keepalived的全局配置 默认配置文件如下: ! Configuration File for keepalived global_defs { notification_email { aca ...

  5. VirtualBox内ubuntu10.10系统和windows7 共享文件夹

    材料 virtualbox 4.3.0 ubuntu10.10 window 7 sp1 步骤 1.安装好虚拟机和操作系统,(具体步骤网上有很多) 2.安装虚拟机的增强功能包, 安装完成手动系统重新, ...

  6. java swing 双人五子棋源代码

    import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; impo ...

  7. LVM逻辑卷管理命令

    显示分区信息: [root@localhost /]# fdisk -l PV:物理硬盘格式化为物理卷(PV): [root@localhost /]# pvcreate /dev/sdb /dev/ ...

  8. asp.net mvc bootstrap datatable 服务端分页 更新槽糕的代码【1】

    datatable 服务端分页 因项目需求变动,需处理大量数据,更改成服务端分页,自己两天的学习笔记 datatable 1.10.7 百度云下载  密码:0ea1 先上图[ jqueryui风格] ...

  9. IDEA中maven搭建Spring+SpringMVC+mybatis项目

    一.介绍 使用IDEA搭建maven web项目,整合框架Spring+SpringMVC+mybatis 项目结构图:

  10. BZOJ4698: Sdoi2008 Sandy的卡片

    差分,枚举一个串的所有后缀,暴力在所有其他串中kmp,复杂度$O(nm^2)$. #include<cstdio> const int N=1005; const int M=105; i ...