Подтвердить что ты не робот

Сопоставьте все подстроки, которые заканчиваются на 4 цифры с использованием регулярных выражений

Я пытаюсь разбить строку в php, которая выглядит так:

ABCDE1234ABCD1234ABCDEF1234

В массив строк, который в этом случае будет выглядеть следующим образом:

ABCDE1234
ABCD1234
ABCDEF1234

Таким образом, шаблон представляет собой undefined количество букв, а затем 4 цифры, затем undefined количество букв и 4 цифры и т.д. "

Я пытаюсь разбить строку с помощью preg_split следующим образом:

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

И он возвращает массив, содержащий полную строку (не разделенную) в первом элементе.

Я предполагаю, что проблема здесь в моем регулярном выражении, поскольку я не совсем понимаю, как их использовать, и я не уверен, правильно ли я использую его.

Итак, каково было бы правильное регулярное выражение?

4b9b3361

Ответ 1

Вы не хотите preg_split, вы хотите preg_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 -строчные регулярные выражения, которые позволяют вам делать lookbehinds. Вы можете использовать это, чтобы увидеть, есть ли 4 цифры за вами. Объедините это с поиском, чтобы увидеть, есть ли впереди вас письмо, и вы получите следующее:

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

Обратите внимание на пунктирные линии на странице Debuggex Demo. Это те точки, которые вы хотите разделить.

В PHP это будет:

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

Ответ 3

Используйте принцип контрастности:

\D+\d{4}
# requires at least one non digit
# followed by exactly four digits

Смотрите демо на regex101.com.


В PHP это будет:
<?php
$string = 'ABCDE1234ABCD1234ABCDEF1234';
$regex = '~\D+\d{4}~';
preg_match_all($regex, $string, $matches);
?>

Смотрите демо на ideone.com.

Ответ 4

Я не гожусь в регулярном выражении, поэтому здесь дорога меньше путешествует:

<?php
$s = 'ABCDE1234ABCD1234ABCDEF1234';
$nums = range(0,9);

$num_hit = 0;
$i = 0;
$arr = array();

foreach(str_split($s) as $v)
{
    if(isset($nums[$v]))
    {
        ++$num_hit;
    }

    if(!isset($arr[$i]))
    {
        $arr[$i] = '';
    }

    $arr[$i].= $v;

    if($num_hit === 4)
    {
        ++$i;
        $num_hit = 0;
    }
}

print_r($arr);