(?=exp)

百度百科给的解释:非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

只看这个,看一辈子恐怕也看不明白。

我们看个案例:

 console.log(('123456789.56').match(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g)); //结果: ["123", "456"]

解释:

首先要满足 : \d{1,3}这个正则。

第 1 步: 开始的 1 满足\d{1,3}最大匹配,后面的 23456789.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “1” 不满足。

第 2 步:开始的 12 满足 \d{1,3}最大匹配,后面的 3456789.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “12” 不满足。

第 3 步:开始的 123 满足 \d{1,3}最大匹配,后面的 456789.56 满足 (?=(\d{3})+(\.\d*)?$),所以这个  “123” 满足,返回  “123”

第 4 步: 从4开始搜索,开始的 4 满足\d{1,3}最大匹配,后面的 56789.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “4 ”不满足。

第 5 步: 从5开始搜索,开始的 45 满足\d{1,3}最大匹配,后面的 6789.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “45“ 不满足。

第 6 步: 从6开始搜索,开始的 456 满足\d{1,3}最大匹配,后面的 789.56 满足 (?=(\d{3})+(\.\d*)?$),所以这个 “456“ 满足,返回 “456”

第 7 步: 从7开始搜索,开始的 7 满足\d{1,3}最大匹配,后面的 89.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “7“ 不满足。

第 8 步: 从8开始搜索,开始的 78 满足\d{1,3}最大匹配,后面的 9.56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “78“ 不满足。

第 9 步: 从9开始搜索,开始的 789 满足\d{1,3}最大匹配,后面的 .56 不满足 (?=(\d{3})+(\.\d*)?$),所以这个 “789“ 不满足,此时“789”满足了 \d{1,3}最大的匹配,但是后面没有能匹配的。

第 10 步: 从 . 开始搜索,开始的 .(.|9. | 89. )都不满足\d{1,3},所以这个 从 . 位置搜索的没满足的。

第 11 步 : 从 5 开始搜索,开始的 5 满足 \d{1,3}最大匹配,后面的6 不满足  (?=(\d{3})+(\.\d*)?$),所以这个 “5“ 不满足。

第 12 步 : 从 6 开始搜索,开始的 56 满足 \d{1,3}最大匹配,后面就没有了,不满足   (?=(\d{3})+(\.\d*)?$),  所以这个 “56 “ 不满足。

说的直接点就是: (?=exp) 里面匹配的内容是不会被 match捕获的,只是当个条件来对待使用,只是用来判断当前检索的位置后面的能否满足这个条件。

 (?<=exp)

也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

有点奇怪,在js 的正则表达式中来测试这个一直报错,猜测估计是不支持。

(?!exp)

这个与  (?=exp) 相反.

console.log(('123456789.56').match(/\d{1,3}(?!(\d{3})+(\.\d*)?$)/g));//["12", "345", "678", "9", "56"]

解释:

首先的满足 \d{1,3}

从 1 处开始搜索,\d{1,3}的最大匹配是 1,后面是 23456789.56  ,满足, (?!(d{3}) +(\.\d*)?$), OK, 此时 \d{1,3} 匹配的是 “1”

第二次从 2 开始搜索,,\d{1,3}的最大匹配是 12, 后面是 3456789.56  ,满足, (?!(d{3}) +(\.\d*)?$), OK, 此时 \d{1,3} 匹配的是 “12”

第三次从 3 开始搜索,\d{1,3}的最大匹配是 123,后面是 456789.56  ,不满足, (?!(d{3}) +(\.\d*)?$),所以返回的结果数组中第一个是 “12”., 此时 \d{1,3} 匹配的最大是是 “12”

第四次从 4 开始搜索, 后面是 56789.56 ,\d{1,3}的最大匹配是 34,满足, (?!(d{3}) +(\.\d*)?$), OK,  此时 \d{1,3} 匹配的是 “34”

第五次从 5 开始搜索, 后面是 6789.56  ,\d{1,3}的最大匹配是 345,满足, (?!(d{3}) +(\.\d*)?$), OK,  此时 \d{1,3} 匹配的是 “345”.,已经满足最大3个数字了,此时返回 “345”

第六次从 6 开始搜索, 后面是 789.56  ,\d{1,3}的最大匹配是 6,不满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 匹配的是 “6”.

第七次从 7 开始搜索, 后面是 89.56  ,\d{1,3}的最大匹配是 67,满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 匹配的是 “67”.

第八次从 8 开始搜索, 后面是 9.56  ,\d{1,3}的最大匹配是 678,满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 匹配的是 “678”.,已经满足最大3个数字了,此时返回 “678”.

第九次从 9 开始搜索, 后面是 .56  ,\d{1,3}的最大匹配是 9,满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 匹配的是 “9”

第十次从 .  开始搜索, 此时 “9.” 不满足 \d{1,3} ,所以此时返回 “9”

第十一次从 5 开始搜索, 后面是 6  ,\d{1,3}的最大匹配是 6,满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 最大匹配的是 “5”

第十二次从 6 开始搜索, 后面没有 ,\d{1,3}的最大匹配是 56,满足, (?!(d{3}) +(\.\d*)?$),  此时 \d{1,3} 最大匹配的是 “56”,结束,返回最后一个 “56”

这只是个人的理解,有不对之处,望各位大神们指正。

javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)的更多相关文章

  1. JavaScript 正则表达式中的特殊字符

    正则表达式中的特殊字符 字符 含义 \ 依照下列规则匹配: 在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解.例如,前面没有 "\" 的 "b" ...

  2. 【转载】【网络安全】渗透中 PoC、Exp、Payload 与 Shellcode 的区别

    原文地址 渗透中 PoC.Exp.Payload 与 Shellcode 的区别 概念 PoC,全称"Proof of Concept",中文"概念验证",常指 ...

  3. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  4. javascript中正则表达式中的 match,exec,test,replace 之我理解

    这个正则 ($&) 的语法: https://msdn.microsoft.com/library/3k9c4a32(v=vs.94).aspx 在ECMAScript中对这几个的说明: ma ...

  5. JavaScript —— 字符串中使用正则表达式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 我所认识的javascript正则表达式

    前言 如果说这是一篇关于正则表达式的小结,我更愿意把它当做一个手册. 目录:(点击可直达) RegExp 三大方法(test.exec.compile) String 四大护法(search.matc ...

  7. javascript正则表达式(一)

    元字符 ( [ { \ ^ $ | ) ? * + . 预定义的特殊字符 字符 正则 描述 \t /\t/ 制表符 \n /\n/ 制表符 \r /\r/ 回车符 \f /\f/ 换页符 \a /\a ...

  8. DOM笔记(十):JavaScript正则表达式

    一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式 ...

  9. JavaScript正则表达式基础

    ECMAScript 3 开始支持正则表达式,其语法和 Perl 语法很类似,一个完整的正则表达式结构如下: var expression = / pattern / flags ; 其中,模式(pa ...

随机推荐

  1. Beta版——爱阅APP功能说明书

    爱阅APP功能说明书 一.引言 通过Alpha发布和一些用户的反馈信息,了解到我们APP存在的问题.针对这些问题我们做了一些修改.以下内容是Beta版的功能说明书. 二.工具 安卓手机 爱阅APP安装 ...

  2. Python 使用sys.exc_info自己捕获异常详细信息

    一般程序中,我们需要对异常进行捕获来保证程序的健壮.但是debug的时候,我们可能需要异常的详细信息,这时可以使用sys.exec_info来处理: import traceback import s ...

  3. CCF-Markdown-201703-3

    这道题不存在递归结构 比如区块之间的相互嵌套 还有"[ [] ]" 链接的相互嵌套, 所以直接处理就好了 还可以 #include <bits/stdc++.h> us ...

  4. Js高级 部分内容 面向对象

    1.单列模式 2.工厂模式 3.构造函数 (1)类 js天生自带的类 Object基类 Function  Array  String  Number  Math Date Boolean Regex ...

  5. layui选项卡-内容为echarts图显示不全的问题

    var width = $("威胁类型ID").width();var height = $("威胁类型ID").height(); $("#威胁来源 ...

  6. 再见了我热爱的ACM赛场

    随着2017EC-Final结束,我的ACM生涯也真正结束了,区域赛三铜三银三金,没有打铁,对我来说算是很满足了. 为什么打了ACM?我记得进入大学之后大概认真上课两三周,我就开始对大学讲课失望,开始 ...

  7. python中表示False的一些内置对象

    By default, an object is considered true unless its class defines either a __bool__() method that re ...

  8. POJ1738 An old Stone Game

    题意 Language:Default An old Stone Game Time Limit: 5000MS Memory Limit: 30000K Total Submissions: 439 ...

  9. TF(2): 核心概念

    TF的核心是围绕Graph展开的,简而言之,就是Tensor沿着Graph传递闭包完成Flow的过程.所以在介绍Graph之前需要讲述一下符号编程.计算流图.梯度计算.控制流的概念. 张量(Tenso ...

  10. 血红蛋白值的临床意义(hemoglobin ,Hb,HGB)

    血红蛋白临床意义:   血红蛋白增高.降低的临床意义基本和红细胞计数的临床意义相似,但血红蛋白能更好地反映贫血的程度. 血红蛋白增多有以下情况: (1)生理性增多:见于高原居民.胎儿和新生儿,剧烈活动 ...