从字符串中提取带有 alpa 字符的最新子字符串,带或不带 PHP 上的其他数字

Extract from string latest substring with alpa character with or not other numbers on PHP

我正在尝试规范化数据系列,但发现其中一个字段存在问题。

从我获取数据的地方,应该是我应该被归一化 return 一个不超过 14 个字符的字符串,由两个字母字符和其余数字组成

但是在这 9000 万个项目之间的某个时候,有些项目可能有一个或两个额外的项目,这些项目总是以一个不确定或可序列化的字母字符和一个数字(或不是)开头

标准化值 (AA + 000000000000)

EP0123456789   
ES123456
FR1234567890123

不正确的值 (AA + 00000000 + A) 或 (AA + 00000000 + A0)

EP1025364758A 
FR1920393874B1 
CH172637488858A
CN727363525252W2

A -> 任何 Alpha
0 -> 任何数字(正数)

为了提取归一化值(AA00000000 代码,A0 KindCode),我使用了一些编译代码。我认为有一个最好的算法

$pat = 'FR1920393874B1';
if (preg_match("/[a-z]/i",substr($pat, -2))) {
   $fail = substr($pat, -2);
   if (preg_match('/[\A-Za-z]+/', $fail, $match, PREG_OFFSET_CAPTURE)) {
      $kind = substr($fail,$match[0][1]);         // B1 
      $pat  = str_replace($kind,'',$pat);     // FR1920393874
   }
}

因此,我需要从输入字符串中获取 2 个值

  1. 前两个字母字符及其后的 1 个或多个数字
  2. 字符串的其余部分

因此,对于 FR1920393874B1,我想获得 FR1920393874B1 作为单独的值。

事实证明,您实际上需要从字符串的其余部分拆分代码并在输出中获得 2 个值。

使用 ^([a-zA-Z]{2}\d+)(.*) 模式:

$pat = 'FR1920393874B1';
if (preg_match('~^([a-zA-Z]{2}\d+)(.*)~', $pat, $m)) {
    echo "Val: " . $m[1] . "\nKind: " . $m[2];
}

PHP demo

详情:

  • ^ - 字符串开头
  • ([a-zA-Z]{2}\d+) - 捕获组 1 ($m[1]):2 个 ASCII 字母和 1+ 个数字
  • (.*) - 捕获第 2 组 ($m[2]):除换行字符外的任何 0+ 个字符,尽可能多(行的其余部分)