使用正则表达式匹配所有以 4 位数字结尾的子字符串

2022-08-30 22:02:02

我试图在php中拆分一个字符串,它看起来像这样:

ABCDE1234ABCD1234ABCDEF1234

放入一个字符串数组中,在本例中,该数组将如下所示:

ABCDE1234
ABCD1234
ABCDEF1234

因此,模式是“未定义数量的字母,然后是4位数字,然后是未定义数量的字母和4位数字等。

我正在尝试使用如下所示的preg_split来拆分字符串:

$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);

它返回一个数组,其中包含第一个元素中的完整字符串(未拆分)。

我猜这里的问题是我的正则表达式,因为我不完全了解如何使用它们,我不确定我是否正确使用它。

那么,使用什么是正确的正则表达式呢?


答案 1

你不想要,你想要:preg_splitpreg_match_all

$str = 'ABCDE1234ABCD1234ABCDEF1234';
preg_match_all('/[a-z]+[0-9]{4}/i', $str, $matches);
var_dump($matches);

输出:

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(9) "ABCDE1234"
    [1]=>
    string(8) "ABCD1234"
    [2]=>
    string(10) "ABCDEF1234"
  }
}

答案 2

PHP使用PCRE风格的正则表达式,可以让你做观察。您可以使用它来查看“后面”是否有4位数字。把它和一个前瞻结合起来,看看你前面是否有一封信,你会得到这个:

(?<=\d{4})(?=[a-z])

请注意调试ex演示页面上的虚线。这些是你想要拆分的点。

在 PHP 中,这将是:

var_dump(preg_split('/(?<=\d{4})(?=[a-z])/i', 'ABCDE1234ABCD1234ABCDEF1234'));

推荐