正则表达式,用于将字符串中的最后一个整数与 php 和 javascript 匹配


Regular expression to match the last integer in a string with php and javascript

我需要匹配字符串中的最后一个整数,并捕获最后一个整数前后的可能元素,假设字符串可以由单个整数或文本和/或整数的组合组成。假设$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+)?

提前感谢!

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

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

在 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;

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

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

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

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

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

这应该为你做...

('d+)(?!.*'d) 

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

尝试使用两种语言的/('d+)$/