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 |
小提琴:现场演示
如果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 |