这是一段非常简单的代码:
<?php
$matches = array();
$str = "You came in 21st out of 53";
preg_match("/(\d+).*(\d+)/",$str,$matches);
echo var_dump($matches);
?>
我正在学习和试验PHP的preg_match和正则表达式。我认为上面的代码会捕获“21”和“53”,但它实际捕获的是“21”和“3”。
这是echo var_dump($ matches);
的结果array(3) {
[0]=> string(14) "21st out of 53"
[1]=> string(2) "21"
[2]=> string(1) "3"
}
如何编写正则表达式以捕获“53”?我希望答案足够通用,它也可以捕获“153”和“jkj53hjjk”(这样表达式不会改为“/(\d+).*(\b\d+)/”。
如果可以进行讨论,为什么在捕获第一个数字时,它会如此贪婪,但是当捕获第二个数字时,它不是贪婪的?它是否向后捕获数字,因此很高兴停在它找到的第一个数字?这可以克服吗?
这是我在Stack Overflow上的第一篇文章。我对这个问题进行了很多研究,但我找不到答案。
答案 0 :(得分:1)
问题是你的。*贪婪并且在正则表达式需要匹配第二个\ d +以便解决之前抓取尽可能多的字符。添加一个?应该允许它按预期工作:
(\d+).*?(\d+)
答案 1 :(得分:0)
/(\d+)[^0-9]+(\d+)/
添加没有任何范围以匹配53
/(\d+)[^0-9]+ (.*\d+.*)/
使用.*
添加空格和环绕\ d以匹配sfgdfg53gfdg
答案 2 :(得分:0)
这是正常的,有文件证明的设计:http://php.net/preg_match:
If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.
如果您不想要完整的匹配字符串,那么只需将array_shift()
从$matches
数组中删除。