不确定正则表达式是否适合此方法,但这是我希望实现的...在由诸如 234 121 6789 < / strong> 4125 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)
答案 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
)