前瞻匹配不好理解。具体的匹配过程是啥,请详解。
比如,如下的代码运行结果,我就想不通啊。
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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
'abcoder'.match(/[a-z]+(?!coder).*/g); 这句表示的是:[a-z]+匹配得到非coder结尾的最大的一个字符串,即abcoder,然后.*匹配后头剩余的内容。你可以测试下这个例子,对这个解答有帮助'啦啦啦codeCODERcoder哈哈'.match(/[a-z]+(?!CODER).*/g)
'abcoder'.match(/[a-z]+(?!coder).*/g);
[a-z]+
coder
abcoder
.*
'啦啦啦codeCODERcoder哈哈'.match(/[a-z]+(?!CODER).*/g)
'abcoder'.match(/(?!coder)/g); 零宽断言表示的只是匹配的位置,由于你没有在前面用字符提出匹配内容,所以匹配的所有结果都为空,但是因为g的原因会匹配7次(字符串的长度),所以会有7个空字符串。
'abcoder'.match(/(?!coder)/g);
g
'quip'.match(/q(?=u)i/); 这句表示的是:匹配u前面的q,同时这个q随后应该是一个i。很明显没有这种情况的字符串,当然是null咯。
'quip'.match(/q(?=u)i/);
u
q
i
null
http://www.regexper.com/这个网站很好玩
http://jsfiddle.net/JCK9K/
引用一段正则教程的原文:
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
(?!exp)
exp
\d{3}(?!\d)
\b((?!abc)\w)+\b
abc
(?<!exp)
exp:(?<![a-z])\d{7}
这种前向断言和后向断言,可以用正则表达式的交集、差集操作实现,nark正则引擎实现了通用的交、差操作
补充一下第二个,如果第二个后面没有全局匹配的标记,只会得到一个空数组,因为有全局匹配,lastIndex属性就会生效,会从上次匹配到位置最后一个字符的下一个字符依次向后匹配,即从索引为0,1,2,3,4,5,6的字符位置都匹配一次,共七次。直至字符串结束。
'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
咯。http://www.regexper.com/
这个网站很好玩
http://jsfiddle.net/JCK9K/
引用一段正则教程的原文:
这种前向断言和后向断言,可以用正则表达式的交集、差集操作实现,nark正则引擎实现了通用的交、差操作
补充一下第二个,如果第二个后面没有全局匹配的标记,只会得到一个空数组,因为有全局匹配,lastIndex属性就会生效,会从上次匹配到位置最后一个字符的下一个字符依次向后匹配,即从索引为0,1,2,3,4,5,6的字符位置都匹配一次,共七次。直至字符串结束。