0

我需要匹配字符串中的最后一个整数,并在最后一个整数之前和之后捕获可能的元素,假设字符串可以由单个整数或文本和/或整数的组合组成。假设 $str 可以是:

  • '123' -> '' - 123 - ''
  • 'abc 123' -> 'abc' - 123
  • 'abc 123 def' -> 'abc' - 123 - 'def'
  • 'abc 123 def 456' -> 'abc 123 def' - 456
  • 等等

我希望php中的以下代码可以完成这项工作:

$str = 'abc 123 def 456 ghi';
preg_match('/(.*)(\d+)(\D*)$/', $str, $matches);
echo 'Matches = ' . implode(' : ', $matches);

但是 (\d+) 只拾取一位数字:

 Matches = abc 123 def 456 ghi : abc 123 def 45 : 6 :  ghi

在我期待的时候:

 Matches = abc 123 def 456 ghi : abc 123 def  : 456 :  ghi

我在 Javascript 中得到相同的行为。(.*) 对 (\d+) 有那么贪婪吗?

提前致谢!

4

5 回答 5

6

为什么不/(\d+)\D*$/呢?这样,唯一的捕获组就是整数。

顺便说一句,当我使用正则表达式时,我通常使用http://gskinner.com/RegExr/

于 2012-05-11T21:50:05.793 回答
2

在 Javascript 中:

$str = 'abc 123 def 456';
$matches = $str.match(/\d+/g);
$lastInt = $matches[$matches.length-1];

在 PHP 中

$str = 'abc 123 def 456';
preg_match_all('/(\d+)/', $str, $matches);
$lastInt = end($matches);
echo 'Last integer = ' . $lastInt;
于 2012-05-11T21:49:38.363 回答
1

您可以完全避免使用 .*,因为模式末尾的 "\D*$" 会确保它是最后一个数字。

也建议你不要添加不必要的括号,只获取你真正需要的。也就是说,您可以执行以下操作以仅获取最后一个数字:

preg_match('/(\d+)\D*$/', $str, $matches);

但是,如果您确实需要对字符串的其他部分进行匹配,并且您要查找的数字将是它自己的单词,您可以在 (\d+) 之前将 \b 参数添加到该正则表达式中,以便 (.* ) 不会贪婪地消耗您的部分号码。IE:

preg_match('/(.*)\b(\d+)(\D*)$/', $str, $matches);
于 2012-05-11T21:56:53.627 回答
0

这应该为你做...

(\d+)(?!.*\d) 
于 2012-05-11T21:49:56.970 回答
0

如果要缓存最后一个整数,则应在正则表达式末尾使用 $。

尝试/(\d+)$/两种语言。

于 2012-05-11T21:50:57.053 回答