从字符串中提取带有 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 个或多个数字
- 字符串的其余部分
因此,对于 FR1920393874B1
,我想获得 FR1920393874
和 B1
作为单独的值。
事实证明,您实际上需要从字符串的其余部分拆分代码并在输出中获得 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];
}
详情:
^
- 字符串开头
([a-zA-Z]{2}\d+)
- 捕获组 1 ($m[1]
):2 个 ASCII 字母和 1+ 个数字
(.*)
- 捕获第 2 组 ($m[2]
):除换行字符外的任何 0+ 个字符,尽可能多(行的其余部分)
我正在尝试规范化数据系列,但发现其中一个字段存在问题。
从我获取数据的地方,应该是我应该被归一化 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 个或多个数字
- 字符串的其余部分
因此,对于 FR1920393874B1
,我想获得 FR1920393874
和 B1
作为单独的值。
事实证明,您实际上需要从字符串的其余部分拆分代码并在输出中获得 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];
}
详情:
^
- 字符串开头([a-zA-Z]{2}\d+)
- 捕获组 1 ($m[1]
):2 个 ASCII 字母和 1+ 个数字(.*)
- 捕获第 2 组 ($m[2]
):除换行字符外的任何 0+ 个字符,尽可能多(行的其余部分)