了解正向预查&反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_replace

preg_match_all 可以看文章:点击查看

preg_replace 可以看文章:点击查看

正向预查&反向预查

正向或反向预查都是非获取匹配,不进行存储供以后使用。

1、正向预查

(?:pattern) 匹配结果

(?=pattern) 正向匹配。

(?!pattern) 正向不匹配。

2、反向预查

(?<=pattern) 反向匹配。

(?<!pattern) 反向不匹配。

什么叫非获取匹配(非捕获匹配),请看例子

一:正向预查

例1 :获取匹配

  1. $str = 'XXXXjava6java7XXXX';
  2. $perg = "/java(6|7)/"; //匹配java6 获取 java7
  3.  
  4. preg_match_all($perg, $str, $matchs);
  5. $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
  6. $str2 = preg_replace($perg, '\1', $str); //"XXXX67XXXX"
  1. $matchs 的输出结果:
  1. array(2) {
  2. [0]=>
  3. array(2) {
  4. [0]=>
  5. string(5) "java6"
  6. [1]=>
  7. string(5) "java7"
  8. }
  9. [1]=>
  10. array(2) {
  11. [0]=>
  12. string(1) "6"
  13. [1]=>
  14. string(1) "7"
  15. }
  16. }

  

知道了preg_match_all的用法,对于上面的输出结果应该很清楚,[n]的后向引用。 [0]中保存的是匹配结果的全文,数组的个数=匹配到结果的个数,[1] 中保存的匹配结果中对应括号中匹配的结果(子组),.....[n]第n个括号中的匹配内容。

  1. preg_replace 中的 \0\1,也是对匹配结果的引用。
  2.  
  3. 理解下:
  1. $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX", 用全文中的匹配结果进行对应替换
  2. $str2 = preg_replace($perg, '\1', $str); //"XXXX67XXXX",用括号中的子结果进行对应的替换

 我们对比知道,\0 的替换内容,是匹配全文的中内容,对应元素的替换。

  1. 2:匹配结果
  1. $str = 'XXXXjava6java7XXXX';
  2. $perg = "/java(?:6|7)/";
  3.  
  4. preg_match_all($perg, $str, $matchs);
  5. $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"

$match 输出结果:

  1. array(1) {
  2. [0]=>
  3. array(2) {
  4. [0]=>
  5. string(5) "java6"
  6. [1]=>
  7. string(5) "java7"
  8. }
  9. }

  

对比1中,我们发现没有括号匹配的结果,这就是我们说的非获取匹配,只匹配全本结果,不捕获括号中的子结果。

  1.  
  2. 3:正向匹配
  1. $str = 'XXXXjava6java7XXXX';
  2. $perg = "/java(?=6|7)/";
  3. preg_match_all($perg, $str, $matchs);
  4. $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
  5. var_dump("<pre>", $matchs, $str1);die;

  

  1. $match 输出结果:
  1. array(1) {
  2. [0]=>
  3. array(2) {
  4. [0]=>
  5. string(4) "java"
  6. [1]=>
  7. string(4) "java"
  8. }
  9. }

  

相比上面的我们匹配的结果中没有 6,7.

例4:正向不匹配

  1. $perg = "/java(?!6)/"; //不匹配java6
  2. preg_match_all($perg, $str, $matchs);
  3. $str1 = preg_replace($perg, '\0', $str); //"XXXXjava6java7XXXX"
  4. var_dump("<pre>", $matchs, $str1);die;

  

  1. $match 输出结果:
  1. array(1) {
  2. [0]=>
  3. array(1) {
  4. [0]=>
  5. string(4) "java"
  6. }
  7. }

  

这里匹配的到结果是java7,但是由于我们用了非获取匹配,就不存贮7,剩下的就是java了

主要:不管是怎么替换,如果我们只要用的是 \0(完整匹配结果) 中的结果进行替换,相当于匹配到了什么就替换掉原字符串中的什么,实际上原字符串没变化,

二 . 反向预查

  1. (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a,结果Java6 Java7
  2.  
  3. (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a,结果Java6 Java7

  

总结:

正向预查,反向预查,就是方向不同。如:正向预查时,具体字符串在左边,/java(?:6|7)/,从字符串开始向右查找;反向则在右边: / (?<=J)a /,从字符串向反方向(左)查找。

  1.  
  1.  

PHP正则 正向预查&反向预查的更多相关文章

  1. Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"

    Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var   reg: TPerlRegEx; begin   ...

  2. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  3. DNS 正向查找与反向查找

    原创地址:http://www.cnblogs.com/jfzhu/p/3996323.html 转载请注明出处 所谓正向查找,就是说在这个区域里的记录可以依据名称来查找对应的IP地址.反向查找就是在 ...

  4. ORM查询之基于对象的正向查询与反向查询

    一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...

  5. [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...

  6. Apache 正向代理与反向代理配置

    Apache提供了 mod_proxy 模块用于提供代理服务,能够支持的包括正向代理.反向代理.透明代理.缓存.负载均衡,HTTP代理.FTP代理.SSL代理等若干强大的功能. 配置代理方法很简单那, ...

  7. nginx正向代理,反向代理,透明代理(总结)

    1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...

  8. 正向代理与反向代理的区别【Nginx读书笔记】

    正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我 ...

  9. 正向代理与反向代理的区别【Nginx读书笔记】(zz)

    正向代理与反向代理的区别[Nginx读书笔记]       正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 ...

随机推荐

  1. JAVA基础知识|继承的几个问题

    1.子类从父类继承了什么? 子类拥有父类非private的属性,方法. 2.子类可以操作父类的非private属性吗? 子类不能继承父类的私有属性,但是如果父类中的非private方法影响到了私有属性 ...

  2. 《Glibc内存管理》笔记DAY5

    目录 分箱式内存管理 Unsorted bin Fast bins 核心结构体分析 malloc_state 内容来源 分箱式内存管理 Unsorted bin   Unsorted bin 可以看作 ...

  3. jQuery Ajax calls and the Html.AntiForgeryToken()

    jQuery Ajax calls and the Html.AntiForgeryToken() https://stackoverflow.com/a/4074289/3782855 I use ...

  4. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  5. Android中为什么主线程不会因为Looper.loop()方法造成阻塞

    很多人都对Handler的机制有所了解,如果不是很熟悉的可以看看我 如果看过源码的人都知道,在处理消息的时候使用了Looper.loop()方法,并且在该方法中进入了一个死循环,同时Looper.lo ...

  6. Docker 部署 ELK 收集 Nginx 日志

    一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...

  7. PAT 甲级 1043 Is It a Binary Search Tree (25 分)(链表建树前序后序遍历)*不会用链表建树 *看不懂题

    1043 Is It a Binary Search Tree (25 分)   A Binary Search Tree (BST) is recursively defined as a bina ...

  8. (一)Rational Rose 2007 下载安装

    因为有画UML图的需求,所以得在电脑上安装Rational Rose.开始准备安装Rational Rose 2003,但是破解过程过于繁琐而且似乎一直遇到各种问题,就决定安装Rational Ros ...

  9. redis 内存数据库

    redis,如果key存在test:a:b 有冒号情况,则在RedisDesktopManager 工具中,可以分文件夹 操作hash // //操作哈希 // client.SetEntryInHa ...

  10. (转)华为 安卓手机在MAC系统下 ADB 识别

    使用MACOS发现在Android开发环境完整的情况下,接入小米,SAMSUNG,HTC,ZTE等手机都可以自动识别,如果暂时不能识别,只需要在 adb_usb.ini 中设置之后也可以识别,并可以在 ...