Rumah  >  Soal Jawab  >  teks badan

正则表达式 - javascript 正则前瞻匹配如何理解?

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

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

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

membalas semua(4)saya akan balas

  • PHP中文网

    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咯。

    balas
    0
  • 迷茫

    迷茫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}匹配前面不是小写字母的七位数字。

    balas
    0
  • PHPz

    PHPz2017-04-10 14:31:02

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

    balas
    0
  • 阿神

    阿神2017-04-10 14:31:02

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

    balas
    0
  • Batalbalas