PHP Regex:查找字符串中所有连续的数字序列吗?

时间:2018-10-05 13:13:49

标签: php regex

不确定正则表达式是否适合此方法,但这是我希望实现的...在由诸如 234 121 6789 < / strong> 4125 123 我要提取至少3个连续数字的所有序列:

  • 234
  • 6789
  • 123

可以用正则表达式完成吗?否则,什么是明智的方法?

3 个答案:

答案 0 :(得分:4)

使用RegEx,您可以使用:

(123(?:4(?:5(?:6(?:7(?:89?)?)?)?)?)?|234(?:5(?:6(?:7(?:89?)?)?)?)?|345(?:6(?:7(?:89?)?)?)?|456(?:7(?:89?)?)?|567(?:89?)?|6789?|789)

在这里尝试:https://regex101.com/r/Ap8C2D/1

如果您也使用012…测试:

(012(?:3(?:4(?:5(?:6(?:7(?:89?)?)?)?)?)?)?|123(?:4(?:5(?:6(?:7(?:89?)?)?)?)?)?|234(?:5(?:6(?:7(?:89?)?)?)?)?|345(?:6(?:7(?:89?)?)?)?|456(?:7(?:89?)?)?|567(?:89?)?|6789?|789)

测试:https://regex101.com/r/zm6I9x/1

答案 1 :(得分:2)

您可以使用RegEx,但老实说,这将更容易实现循环并检查循环中数字是否连续。看一下这个例子:

$literal = '23412167894125123';

for ($c = 0; $c < strlen($literal) - 2; $c++) {
    if(intval($literal[$c]) + 1 == intval($literal[$c + 1]) &&
       intval($literal[$c]) + 2 == intval($literal[$c + 2])) {
        echo $literal[$c], $literal[$c + 1], $literal[$c + 2], '<br />';
    }
}

提琴:Live Demo

答案 2 :(得分:1)

如果正则表达式看起来太复杂,则此函数使用简单的for循环

function findSeq($string) {

    $seq_started = false;

    $seq = '';

    $list = [];

    for ($i = 1; $i < strlen($string) + 1; $i++) {

        @$curr = $string[$i];
        $prev = $string[$i - 1];
        @$next = $string[$i + 1];

        if ($prev + 1 == $curr) {

            if ($seq_started === false) {

                $seq .= "$prev$curr";

            } else {

                $seq .= $curr;
            }

            $seq_started = true;

            continue;

        }

        if ($seq_started === true) {

            if (strlen($seq) > 2) {

                $list[] = $seq;

            }

            $seq = '';

            $seq_started = false;

        }

    }

    return $list;

}

print_r(findSeq('2341216789412501231456789'));

输出

Array
(
    [0] => 234
    [1] => 6789
    [2] => 0123
    [3] => 456789
)