我已经看到了很多关于为疯狂寻找字符串和东西识别重复模式的问题,但没有任何可以捕获重复数字或重复数字模式的问题。
我试图想出一种方法来编写一个可以识别这两种情况的函数。例如,我有一个类似于14285714285714
的数字模式,模式为142857-142857-14
。在某些情况下,模式可以是7575757
:75-75-75-7
。我还有一个重复出现的号码,例如55555555
或55555556
。
我怎样才能创建一个确定数字是重复还是有模式的函数?我想重复的数字可以看作是这种意义上的模式。我对此感到茫然,对此的任何帮助都将不胜感激。
提前谢谢。
编辑如果模式或重复出现超过3位,我也只需要抛出真。
更新所以我尝试使用preg_match进行@stribizhev推荐,并确实能够检测到模式。我仍然需要我的模式更精确。如果我的号码为4444
,则preg_match会将我的模式显示为44-44
。我需要能够了解4-4-4-4
和75-75-75
之间的区别。有人可以帮我澄清一下如何从preg_match获得更精确的结果吗?
这是我到目前为止所拥有的。
$num = 4444;
if (count($num) >= 3) {
$result = preg_match('/(\d+)\1/', $num, $matches);
if ($result) {
$repeat = "true";
echo "match: ".$matches[0].", ".$matches[1];
}
}
output: match: 4444, 44
虽然这个输出并不准确,但它并不像我需要的那样具体。 44是图案,但更重要的是图案4。就像7575一样,75是模式。
答案 0 :(得分:3)
这种模式可以胜任:
$pattern = '~
\A # start of the string
# find the largest pattern first in a lookahead
# (the idea is to compare the size of trailing digits with the smallest pattern)
(?= (\d+) \1+ (\d*) \z )
# find the smallest pattern
(?<pattern> \d+? ) \3+
# that has the same or less trailing digits
(?! .+ \2 \z)
# capture the eventual trailing digits
(?= (?<trailing> \d* ) )
~x';
if (preg_match($pattern, $num, $m))
echo 'repeated part: ' . $m[0] . PHP_EOL
. 'pattern: ' . $m['pattern'] . PHP_EOL
. 'trailing digits: ' . $m['trailing'] . PHP_EOL;