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

Dev*_*Bob 17 php regex string preg-split

我试图在PHP中拆分一个字符串,如下所示:

ABCDE1234ABCD1234ABCDEF1234
Run Code Online (Sandbox Code Playgroud)

进入一个字符串数组,在这种情况下,看起来像这样:

ABCDE1234
ABCD1234
ABCDEF1234
Run Code Online (Sandbox Code Playgroud)

因此,模式是"未定义的字母数,然后是4位数,然后是未定义的字母数和4位数等."

我正在尝试使用preg_split分割字符串,如下所示:

$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);
Run Code Online (Sandbox Code Playgroud)

它返回一个包含第一个元素中的完整字符串(不是拆分)的数组.

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

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

mis*_*tin 16

你不想要preg_split,你想要preg_match_all:

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

输出:

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


fun*_*urm 7

PHP使用PCRE风格的正则表达式,让你做后卫.您可以使用它来查看您后面是否有4位数字.将它与前瞻相结合,看看你前面是否有一封信,你就明白了:

(?<=\d{4})(?=[a-z])
Run Code Online (Sandbox Code Playgroud)

注意Debuggex Demo页面上的虚线.这些是你想分开的点.

在PHP中,这将是:

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


Jan*_*Jan 5

使用对比原理:

\D+\d{4}
# requires at least one non digit
# followed by exactly four digits
Run Code Online (Sandbox Code Playgroud)

请参阅regex101.com上的演示.


PHP这将是:

<?php
$string = 'ABCDE1234ABCD1234ABCDEF1234';
$regex = '~\D+\d{4}~';
preg_match_all($regex, $string, $matches);
?>
Run Code Online (Sandbox Code Playgroud)

请参见上ideone.com演示.