基础 - 贪婪模式

  • 作者:KK

  • 发表日期:2017.7.9


要点速读

  1. <div>.*?</div>能匹配xxx <div>111</div>abc<div>222</div> xxx里面的<div>111</div><div>222</div>这2个结果,这是非贪婪模式

  2. <div>.*</div>能匹配xxx <div>111</div>abc<div>222</div> xxx里面的<div>111</div>abc<div>222</div>,这是贪婪模式

  3. 贪婪模式下,表达式说的是从div开头到div结束,于是它就匹配到最后一个div结束为止(中间碰到了第一个结束的div都不会停止),够贪心的吧!

  4. 在匹配量修饰符后面加个问号就是非贪婪模式,前面讲过*表示0次或多次,+表示1次或多次,?表示0次或1次,{m,n}表示m次到n次,{m,}表示m次以上,这些匹配数量的修饰符后面再加一个?号就是非贪婪模式


JS代码

//非贪婪+非全局匹配
console.log(
	'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*?<\/div>/)
	// <div>111</div>
);

//非贪婪+全局匹配
console.log(
	'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*?<\/div>/g)
	// <div>111</div> 和 <div>222</div>		因为g修饰符开启了全局匹配模式
);

//贪婪模式
console.log(
	'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*<\/div>/)
	// <div>111</div>abc<div>222</div>
);

PHP代码

header('Content-type:text/plain');

//非贪婪+非全局匹配
preg_match('#<div>.*?<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult1);
print_r($matchResult1); // <div>111</div>

//非贪婪+全局匹配
preg_match_all('#<div>.*?<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult2);
print_r($matchResult2); // <div>111</div> 和 <div>222</div>

//贪婪模式
preg_match_all('#<div>.*<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult3);
print_r($matchResult3); // <div>111</div>abc<div>222</div>