php正则表达式正向预查,javascript正则表达式-----正向预查

前几篇有用到过, 但是未做深入学习,发现一篇很好的博文

转载自 javascript--正向预查

什么是正向预查?这里有腾讯招聘的一个例子:

如何给一串数字用千分制表示?比如9999999999变成9,999,999,999。这样一个问题你会怎么答呢?博主js正则学的不咋样,然后用操作字符串的办法做,变成字符串,先除以3,看有几对,然后再加逗号…………(省略无数个步骤)

直到有一天我看到了这样一个回答:

var f = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');

console.log(f);

一行代码搞定了。我当时是惊呆的0.0,但是不知道这是啥意思阿。就重新学了一遍正则,发现里面有个叫正向预查的东西,很神奇,就一起来看看这是什么鬼。

(?=)这个东西就是正向预查。

先给一个简单的例子:

var con="coming soon,going gogogo"

var reg = /\b[\w]+(?=ing\b)/g;//匹配带ing的单词,但是不要ing。注意:如果ing后不加\b,类似于goingabc也会匹配。

console.log(con.match(reg));

这里匹配到["com", "go"]。先匹配单词边界\b,然后+匹配前面多次或者一次,然后到这个正向预查,(?=ing)表示先向后探测,看看有没有ing。如果有,则把前面的匹配出来;如果没有,则光标往后移一位,继续探测。这个过程就是正向预查:预先判断为某个值。然后匹配到的东西不包含这个元素,这里也就是ing。官方原话是该匹配不需要获取以供以后使用,是一个非捕获匹配。

相似的还有非捕获性数组: (?: )

var color = "#990000";

/#(?:\d+)/.test(color);

alert(RegExp.$1);//""

这里的正向预查,属于零宽断言,也是正向前瞻。

零宽断言

正则

名称

描述

(?=exp)

正向前瞻

匹配exp前面的位置

(?!exp)

负向前瞻

匹配后面不是exp的位置

(?<=exp)

正向后瞻

匹配exp后面的位置(不支持)

(?!exp)

负向后瞻

匹配后面不是exp的位置(不支持)

正向前瞻用来检查接下来的出现的是不是某个特定的字符集。而负向前瞻则是检查接下来的不应该出现的特定字符串集。零宽断言是不会被捕获的。

不过javascript不支持后瞻。

好,回到我们的问题,为了方便观察,我们换做1234567890来匹配

"1234567890".match(/\d{1,3}(?=(\d{3})+$)/g)

\d首先贪婪匹配123,成功,进入顺序肯定环视,456,789匹配成功,控制权交到$匹配789,匹配失败,回溯

\d匹配12,成功,进入顺序肯定环视,345,678匹配成功,控制权交到$匹配678,匹配失败,回溯

\d匹配1,成功,进入顺序肯定环视,234,567,890,控制权交到$匹配890,匹配成功.

\d贪婪匹配234,成功,进入顺序肯定环视,567,890匹配成功,控制权交到$匹配890,匹配成功

\d贪婪匹配567,成功,进入顺序肯定环视,890匹配成功,控制权交到$匹配890,匹配成功

\d贪婪匹配890,成功,进入顺序肯定环视,匹配空字符串匹配失败,匹配失败。

\d匹配89,\d匹配8在顺序肯定环视里都会失败,于是返回。

文档匹配1,234,567

还有一些资料:

3a9e7ece53ba

image.png

3a9e7ece53ba

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值