正则表达式 - javascript 正则前瞻匹配如何理解?
高洛峰
高洛峰 2017-04-10 14:29:02
0
4
498

前瞻匹配不好理解。具体的匹配过程是啥,请详解。

比如,如下的代码运行结果,我就想不通啊。

var reg=/[a-z]+(?!coder).*/g;
'abcoder'.match(reg);//["abcoder"]
var reg=/(?!coder)/g;
'abcoder'.match(reg);//["", "", "", "", "", "", ""]
'quip'.match(/q(?=u)i/);//null,why?
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(4)
Ty80

'abcoder'.match(/[a-z]+(?!coder).*/g);
这句表示的是:[a-z]+匹配得到非coder结尾的最大的一个字符串,即abcoder,然后.*匹配后头剩余的内容。你可以测试下这个例子,对这个解答有帮助'啦啦啦codeCODERcoder哈哈'.match(/[a-z]+(?!CODER).*/g)

'abcoder'.match(/(?!coder)/g);
零宽断言表示的只是匹配的位置,由于你没有在前面用字符提出匹配内容,所以匹配的所有结果都为空,但是因为g的原因会匹配7次(字符串的长度),所以会有7个空字符串。

'quip'.match(/q(?=u)i/);
这句表示的是:匹配u前面的q,同时这个q随后应该是一个i。很明显没有这种情况的字符串,当然是null咯。

いいねを押す +0
迷茫

http://www.regexper.com/
这个网站很好玩

http://jsfiddle.net/JCK9K/

引用一段正则教程的原文:

零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp
例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

いいねを押す +0
PHPzhong

这种前向断言和后向断言,可以用正则表达式的交集、差集操作实现,nark正则引擎实现了通用的交、差操作

いいねを押す +0
阿神

补充一下第二个,如果第二个后面没有全局匹配的标记,只会得到一个空数组,因为有全局匹配,lastIndex属性就会生效,会从上次匹配到位置最后一个字符的下一个字符依次向后匹配,即从索引为0,1,2,3,4,5,6的字符位置都匹配一次,共七次。直至字符串结束。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート