[正则表达式]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",注意结果是包括的空格哦,没显示红色部分是因为空格标注不了红色。。。

如果不能理解,回头看多几遍介绍,一定会明白的。

时间: 2024-08-06 20:07:23

[正则表达式]PCRE环视功能的相关文章

正则表达式的环视和匹配

环视 环视匹配的最终结果就是一个位置,有四种类型的环视: (?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression (?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression (?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression (?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression 可以用以下两个正则表达式理解环视: (1)字母.数字.特殊符号全部出现,至少

PHP 正则表达式(PCRE)

PHP 正则表达式(PCRE) 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 更多正则表达式的内容可参考我们的:正则表达式 - 教程. PHP 中我们可以使用 PCRE 扩展来匹配字符串的模式. PCRE 函数 函数 描述 preg_filter 执行一个正则表达式搜索和替换 preg_grep 返回匹配模式的数组条目 preg_last_error 返回最后一个PCR

正则表达式的环视

环视的英文叫做lookaround,这是在"精通正则表达式"一书中的叫法.在不同的书籍跟文档中,它又被叫做"断言","前视","预搜索"等.环视分为以下几种. 顺序肯定环视.表示所在位置右侧能够匹配Expression.在python中为string(?=Expression),在vim中为/string\(Expression\)\@= 顺序否定环视.表示所在位置右侧能够匹配Expression.在python中为strin

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

1. 获取功能: Pattern 和 Matcher类结合使用 2. 使用案例: 1 package cn.itcast_05; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 /* 7 * 获取功能 8 * Pattern和Matcher类的使用 9 * 10 * 模式和匹配器的基本使用顺序 11 */ 12 public class RegexDemo { 13 public static v

正则表达式中分组功能高级用法

通过将部分正则表达式用括号括住来实现分组捕获的用法大部分人都很熟悉,如/.+(\d+).+/捕获字符串中的所有数字部分,然后通过组号就可以抽取出各分组匹配的字符文本或者通过反向引用的方式对分组中的文本进行替换.但是除了不同的分组用法以外,正则表达式引擎还提供了一些高级的分组功能,下面介绍部分比较常用的特殊分组: 1.非捕获分组( non-capturing group) 使用语法:(?:regex)这里的?和:都是语法的组成部分:这种分组正则表达式引擎不会捕获它所匹配的内容即不会为非捕获型分组分

正则表达式之环视(java)

下面我所写的都是参考自精通正则表达式(第三版). 什么是环视 环视顾名思义就是从四周看.正则表达式一向都是从左向右工作的,但是环视也能从右向左工作.最典型的列子就是给你一个数字如 12345678,需要你改成12,345,678这种格式.如果按照我们的思维来,应该是会从右边开始划分吧,每三个数字加一个逗号.环视就能按照我们的思维去解决这样的问题.这里要注意的是环视不匹配任何字符,只是匹配位置而已.作用和^,&相似.环视又分为顺序环视和逆序环视.也就是从左到右工作和从右到左的区别.顺序环视在正则中

js 正则表达式之环视结构

一.环视 1:环视不"占用"字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正则匹配,黄色表示断言匹配 (1):起始位为0 (2):从左向右查看文本,如果当前位置字符与表达式2匹配成功,就查看右侧文本是否满足断言条件,当条件1与条件2都成立时就匹配成功. 三.肯定逆向环视(?<=...) 子表达式匹配当前位置的左侧字符 图中:红色表示当前位置,绿色表示正则匹配

雷林鹏分享:PHP 正则表达式(PCRE)

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 更多正则表达式的内容可参考我们的:正则表达式 - 教程. PHP 中我们可以使用 PCRE 扩展来匹配字符串的模式. PCRE 函数 函数描述 preg_filter执行一个正则表达式搜索和替换 preg_grep返回匹配模式的数组条目 preg_last_error返回最后一个PCRE正则执行产生的错误代码 preg_ma

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

1. 看程序写结果:(面试题考过) 1 package cn.itcast_03; 2 3 /* 4 * 分割功能练习 5 */ 6 public class RegexDemo2 { 7 public static void main(String[] args) { 8 // 定义一个字符串 9 String s1 = "aa,bb,cc"; 10 // 直接分割 11 String[] str1Array = s1.split(","); 12 for (in