PHP正则表达式:查找字符串中的所有连续数字序列?

PHP Regex: find all consecutive number sequences in a string?

不确定正则表达式是否是实现这一点的正确方法,但下面是我希望实现的…在由经过排序的数字组成的字符串(如234112167894125123)中,我希望提取至少3个连续数字的所有序列:

  • 二百三十四
  • 六千七百八十九
  • 一百二十三

这可以用regex完成吗?否则,什么是明智的做法?


使用regex,您可以使用:

1
(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……测试:

1
(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


您可以使用regex,但老实说,实现一个循环并检查循环中的数字是否是连续的会更简单。看看这个例子:

1
2
3
4
5
6
7
8
$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 />';
    }
}

小提琴:现场演示


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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'));

产量

1
2
3
4
5
6
7
Array
(
    [0] => 234
    [1] => 6789
    [2] => 0123
    [3] => 456789
)