正则表达式, 贪婪模式
2018-2-28 10:15:09 星期三
好几年没怎么用过正则了, 正则有一个常见的用法就是非贪婪模式
方法一:
? 在 . + 和 * 之后 表示非贪婪匹配;
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
这和 ? 本身代表0次或1次的限制有关
. | 除了换行符外的任意字符(可用修饰符/s使之匹配换行符) |
.* | 匹配0个或多个任意字符 |
.+ | 匹配1个或多个任意字符 |
.? | 匹配0个或1个任意字符 |
a{2} | 匹配连续出现的2个a |
a{2,3} | 匹配连续出现的2个或3个a |
a{2,} | 匹配连续出现2个以上的所有a |
方法二:
添加模式修饰符: U
举例(PHP):
1 $a = 'aaaa0123456789'; 2 3 preg_match('#(\d+)#', $a, $match); print_r($match); //贪婪匹配, 匹配尽可能多的数字 4 preg_match('#(\d+?)#', $a, $match); print_r($match); //非贪婪匹配, 最多只匹配一个数字 5 preg_match('#(\d+)#U', $a, $match); print_r($match); //非贪婪匹配, 最多只匹配一个数字
结果:
1 //第3行匹配结果 2 Array 3 ( 4 [0] => 0123456789 5 [1] => 0123456789 6 ) 7 8 //第4行匹配结果 9 Array 10 ( 11 [0] => 0 12 [1] => 0 13 ) 14 15 //第5行匹配结果 16 Array 17 ( 18 [0] => 0 19 [1] => 0 20 )