进阶 - 正反向预查 ¶
作者:KK
发表日期:2017.8.29
要点速读 ¶
写法是“
?=
string”,通常前面还有固定的字符串,例如Windows(?=2000|XP|7)
,关键符号是?=
Windows(?=2000|XP|7)
能匹配Windows7里的Windows,也能匹配Windows2000和WindowsXP里的Windows,但不能匹配Windows2008里的Windows我的解读逻辑是:提前向右边找找有没有预查表达式里的内容,如果有的话那就匹配括号左边的指定内容
还有个反向预查,思维是相反的,比如
Windows(?!2000|XP|7)
不能匹配Windows7、Windows2000、WindowsXP里的Windows,却能匹配Windows2008里的Windows
JS ¶
console.log( 'WindowsXP'.match(/Windows(?=2000|XP|7)/)[0] ); // Windows
console.log( 'Windows7'.match(/Windows(?=2000|XP|7)/)[0] ); // Windows
console.log( 'Windows2000'.match(/Windows(?=2000|XP|7)/)[0] ); // Windows
console.log( 'Windows2008'.match(/Windows(?=2000|XP|7)/) ); // null
//高级点
console.log( 'Windows2000'.match(/Win\w+(?=2000|XP|7)/) ); // Windows
console.log( 'Windows2006'.match(/Win\w+(?=2\d+)/)[0] ); // Windows
console.log( 'Windows2007'.match(/Win\w+(?=2\d+)/)[0] ); // Windows
console.log( 'Windows2008'.match(/Win\w+(?=2\d+)/)[0] ); // Windows
console.log( 'Windows3008'.match(/Win\w+(?=2\d+)/)[0] ); // null
PHP ¶
preg_match('#Windows(?=2000|XP|7)#', 'WindowsXP', $matchResult1);
preg_match('#Windows(?=2000|XP|7)#', 'Windows7', $matchResult2);
preg_match('#Windows(?=2000|XP|7)#', 'Windows2000', $matchResult3);
preg_match('#Windows(?=2000|XP|7)#', 'Windows2008', $matchResult4);
//高级点
preg_match('#Win\w+(?=2000|XP|7)#', 'Windows2000', $matchResult5);
preg_match('#Win\w+(?=2\d+)#', 'Windows2006', $matchResult6);
preg_match('#Win\w+(?=2\d+)#', 'Windows2007', $matchResult7);
preg_match('#Win\w+(?=2\d+)#', 'Windows2008', $matchResult8);
preg_match('#Win\w+(?=2\d+)#', 'Windows3008', $matchResult9);
header('Content-type:text/plain');
print_r([
$matchResult1[0], //Windows
$matchResult2[0], //Windows
$matchResult3[0], //Windows
$matchResult4, //匹配失败
$matchResult5[0], //Windows
$matchResult6[0], //Windows
$matchResult7[0], //Windows
$matchResult8[0], //匹配失败
$matchResult9, //匹配失败
]);
反向预查 ¶
这个思维是相反的,比如Windows(?!2000|XP|7)
不能匹配Windows7、Windows2000、WindowsXP里的Windows,却能匹配Windows2008里的Windows,例子就不做了,关键符号就是?!