簡體   English   中英

PHP正則表達式:查找字符串中所有連續的數字序列嗎?

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

不確定正則表達式是否是正確的方法,但是這是我要實現的目標...在由諸如234 121 6789 4125 123之類的排序數字組成的字符串中,我想提取至少3個連續的所有序列位數:

  • 234
  • 6789
  • 123

可以用正則表達式完成嗎? 否則,什么是明智的方法?

使用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

您可以使用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 />';
    }
}

小提琴: 現場演示

如果正則表達式看起來太復雜,則此函數使用簡單的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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM