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



регулярные выражения онлайн (4)

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

ABCDE1234ABCD1234ABCDEF1234

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

ABCDE1234
ABCD1234
ABCDEF1234

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

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

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

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

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

Так что бы правильное регулярное выражение использовать?


Answer #1

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

\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 .


Answer #2

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

<?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);

Answer #3

PHP использует регулярные выражения в стиле PCRE которые позволяют вам делать вид сзади. Вы можете использовать это, чтобы увидеть, есть ли 4 цифры "позади" вас. Объедините это с предвкушением, чтобы увидеть, есть ли перед вами письмо, и вы получите это:

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

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

В PHP это будет:

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

Answer #4

Вы не хотите 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"
  }
}




preg-split