匹配优先量词我们已经学习了,就是?、+、*、{}这四个。匹配优先量词在匹配的时候首先会尝试匹配,如果失败后回溯才会选择忽略。比如`ab?`匹配"abb"会得到"abb"。这里当匹配成功'a'后,引擎有两个选择,一个是尝试匹配后面的b,一个是忽略后面的b,而由于是匹配优先,所以引擎会尝试匹配b,发现可以匹配,得到了"ab",接着引擎又一次遇到了同样的问题,还是会选择先匹配,所以得到了"abb",接着引擎发现后面没有字符了,就上报匹配成功。
忽略优先量词使用的是在?、+、*、{}后面添加?组成的,忽略优先在匹配的时候首先会尝试忽略,如果失败后回溯才会选择尝试。比如`ab??`匹配“abb”会得到‘a’而不是“ab”。当引擎匹配成功a后,由于是忽略优先,引擎首先选择不匹配b,继续查看表达式,发现表达式结束了,那么引擎就直接上报匹配成功。
例子1:
var reg1=/ab?/;
var reg2=/ab??/;
var result1=reg1.exec("abc");
var result2=reg2.exec("abc");
document.write(result1+" "+result2);
结果:
例子2:
var reg1=/ab+/;
var reg2=/ab+?/;
var result1=reg1.exec("abbbc");
var result2=reg2.exec("abbbc");
document.write(result1+" "+result2);
结果:
例子3:
var reg1=/ab*/;
var reg2=/ab*?/;
var result1=reg1.exec("abbbc");
var result2=reg2.exec("abbbc");
document.write(result1+" "+result2);
结果:
例子4:
var reg1=/ab{2,4}/;
var reg2=/ab{2,4}?/;
var result1=reg1.exec("abbbbbbc");
var result2=reg2.exec("abbbbbbc");
document.write(result1+" "+result2);
结果:
下面我们来看稍微复杂一点的匹配优先的情况,使用`c.*d`去匹配字符串“caaadc”,我们发现当c匹配成功后,`.*`会一直匹配到最后的'c',然后再去匹配表达式里面的d,发现后面没有字符可以匹配,这是就会回溯到`.*`匹配'c'的地方,选择`.*`忽略'c',那么c就留给后面了,但是发现还是不能匹配d,又得回溯到匹配d的位置,`.*`再次选择忽略匹配,发现就可以匹配d了,这是停止匹配,上报匹配成功,所以结果是“caaad”。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-22527-2.html
又怎么办再打巴萨尔没理由了