使用PHP preg_match捕获字符串中的两个数字

时间:2014-02-28 00:43:37

标签: php regex preg-match

这是一段非常简单的代码:

<?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" 
         } 
  1. 如何编写正则表达式以捕获“53”?我希望答案足够通用,它也可以捕获“153”和“jkj53hjjk”(这样表达式不会改为“/(\d+).*(\b\d+)/”。

  2. 如果可以进行讨论,为什么在捕获第一个数字时,它会如此贪婪,但是当捕获第二个数字时,它不是贪婪的?它是否向后捕获数字,因此很高兴停在它找到的第一个数字?这可以克服吗?

  3. 这是我在Stack Overflow上的第一篇文章。我对这个问题进行了很多研究,但我找不到答案。

3 个答案:

答案 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数组中删除。