Rumah > Soal Jawab > teks badan
前瞻匹配不好理解。具体的匹配过程是啥,请详解。
比如,如下的代码运行结果,我就想不通啊。
var reg=/[a-z]+(?!coder).*/g;
'abcoder'.match(reg);//["abcoder"]
var reg=/(?!coder)/g;
'abcoder'.match(reg);//["", "", "", "", "", "", ""]
'quip'.match(/q(?=u)i/);//null,why?
PHP中文网2017-04-10 14:31:02
'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
咯。
迷茫2017-04-10 14:31:02
http://www.regexper.com/
这个网站很好玩
http://jsfiddle.net/JCK9K/
引用一段正则教程的原文:
零宽度负预测先行断言
(?!exp)
,断言此位置的后面不能匹配表达式exp
。
例如:\d{3}(?!\d)
匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b
匹配不包含连续字符串abc
的单词。
同理,我们可以用(?<!exp)
,零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}
匹配前面不是小写字母的七位数字。
阿神2017-04-10 14:31:02
补充一下第二个,如果第二个后面没有全局匹配的标记,只会得到一个空数组,因为有全局匹配,lastIndex属性就会生效,会从上次匹配到位置最后一个字符的下一个字符依次向后匹配,即从索引为0,1,2,3,4,5,6的字符位置都匹配一次,共七次。直至字符串结束。