进阶 - 正反向预查

  • 作者:KK

  • 发表日期:2017.8.29


要点速读

  1. 写法是“?=string”,通常前面还有固定的字符串,例如Windows(?=2000|XP|7),关键符号是?=

  2. Windows(?=2000|XP|7)能匹配Windows7里的Windows,也能匹配Windows2000和WindowsXP里的Windows,但不能匹配Windows2008里的Windows

  3. 我的解读逻辑是:提前向右边找找有没有预查表达式里的内容,如果有的话那就匹配括号左边的指定内容

  4. 还有个反向预查,思维是相反的,比如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,例子就不做了,关键符号就是?!