如何将字符串的数字部分增加一个?

问题描述 投票:15回答:5

我有一个由数字组成的字符串,有时是字母。

例如AF-1234345ww

我必须得到数字部分并将其递增1。 我怎样才能做到这一点?可能与正则表达式?

php regex string
5个回答
28
投票

您可以使用preg_replace_callback作为:

function inc($matches) {
    return ++$matches[1];
}

$input = preg_replace_callback("|(\d+)|", "inc", $input);

基本上,您使用正则表达式\d+匹配字符串的数字部分,并将其替换为回调函数返回的值,该函数返回递增的值。

Ideone link

或者,这可以使用preg_replace()e修饰符完成:

 $input = preg_replace("|(\d+)|e", "$1+1", $input);

Ideone link


6
投票

如果字符串以数字字符结尾,就这么简单......

$str = 'AF-1234';
echo $str++; //AF-1235

这与'345ww'的工作方式相同,但结果可能不是您所期望的。

$str = '345ww';
echo $str++; //345wx

@ tampe125

如果递增以数字结尾的字符串,此示例可能是满足您需求的最佳方法。

$str = 'XXX-342';
echo $str++; //XXX-343

4
投票

这是一个通过对值进行预增量为我工作的示例

$admNo = HF0001;
$newAdmNo = ++$admNo;

上面的代码将输出HF0002


0
投票

这里有一些Python代码可以满足您的要求。我的PHP不太好,但我会看看我是否可以为你转换它。

>>> import re
>>> match = re.match(r'(\D*)(\d+)(\D*)', 'AF-1234')
>>> match.group(1) + str(int(match.group(2))+1) + match.group(3)
'AF-1235'

0
投票

如果您正在处理具有多个数字部分的字符串,那么使用正则表达式解决它并不容易,因为您可能会有数字从一个数字部分溢出到另一个数字部分。

例如,如果你有一个数字INV00-10-99,它应该增加到INV00-11-00

我最终得到了以下内容:

for ($i = strlen($string) - 1; $i >= 0; $i--) {
  if (is_numeric($string[$i])) {
    $most_significant_number = $i;
    if ($string[$i] < 9) {
      $string[$i] = $string[$i] + 1;
      break;
    }
    // The number was a 9, set it to zero and continue.
    $string[$i] = 0;
  }
}

// If the most significant number was set to a zero it has overflowed so we
// need to prefix it with a '1'.
if ($string[$most_significant_number] === '0') {
  $string = substr_replace($string, '1', $most_significant_number, 0);
}
© www.soinside.com 2019 - 2024. All rights reserved.