javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)

 (?=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”

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

时间: 2024-08-27 05:13:27

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

javascript 正则表达式中 中括号的“坑”

在javascript中使用正则时需要注意中括号里边的一个坑,那就是中括号内的元字符问题.自己踩到坑了,网上搜了一下还有不少人踩了这个坑,所以大概说一下. 中括号在正则中称为字符组(Character class),有的书翻译为字符类,还有的翻译成字符集.我觉得字符组更好点,毕竟class在计算机属于中代表面向对象里的“类”.顾名思义,字符组为一组字符,它表示在一个位置里可能出现的多种字符.注意这里强调只匹配一个位置哦.(此段摘自-http://www.cnblogs.com/snandy/p/

JavaScript正则表达式知识汇总

Js 正则表达式知识汇总 正则表达式: 1.什么是RegExp?RegExp是正则表达式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

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

二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 exec方法的返回值 exec方法返回的其实并不是匹配结果字符串,而是一个对象,简单地修改一下execReg函数,来做一个实验就可以印证这一点: function execReg(reg, str) { var result = reg.exec(str); alert(typeof result

JavaScript中正则表达式中遇到的问题——测试匹配

关于正则表达式中字符串测试分问题,我们一般有test()和exec()两种方法,关于这两种方法的区别我这里就不加详细阐述了,主要就是test()返回布尔值,exec()返回匹配到的字符数组,但是今天我遇到一个问题, 程序非常简单,但是里面的问题让我很想不通,在网上找答案也没有找到(个人比较菜). var pattern=new RegExp("match","ig"); alert(pattern.test("Match")); alert(pa

正则表达式中各种字符的意义

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由所有那些未显式指定为元字符的

正则表达式中各种字符的含义

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由所有那些未显式指定为元字符的

正则表达式中各字符的含义

正则表达式中各种字符的含义 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由

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

一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式:flags是每个正则表达式所带的一个或者多个标志. 正则表达式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串,而非在发现第一个匹配项时立即停止 i:不区分大小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正则表达式 JavaScr

javascript正则表达式笔记(转载)

在javascript里面的定义 1.通过RegExp构造函数定义一个正则表达式.第一个参数为正则表达式以字符串传入,第二个参数为修饰符也以字符串传入. 例:var caps = new RegExp("[A-Z]", "g"); 2.直接定义一个正则表达式直接量,表达式右正斜杠符号"/"分隔,后直接跟修饰符.(推荐用这种) 例:var caps = /[A-Z]/g; javascript正则表达式常用的字符 字符 描述 例子 [exp] 对于