检查字符串是否由重复模式组成

Lea*_*ode 0 regex string perl

我想检查类似的模式是否在二进制字符串中重复.

例如,如果字符串是

11110111101111011110 or
100111100111100111100111
Run Code Online (Sandbox Code Playgroud)

我想检测第一个字符串总是重复11110而另一个字符串是100111.我怎样才能在Perl中完成这样的任务?重复的字符串可以是任何长度.

cho*_*oba 6

使用正则表达式:

for my $string (qw(11110111101111011110 100111100111100111100111 1101101101)) {
    print $string, ' ', $string =~ /^ (.*?) \1+ $/x ? 'yes' : 'no', "\n";
}
Run Code Online (Sandbox Code Playgroud)

请注意,它适用于任何字符串,而不仅仅是包含0和1的字符串.

说明:

^     Beginning of the string.
(.*?) Anything, try from the shortest possible, remember.
\1+   The remembered thing repeated at least once.
$     End of the string.
Run Code Online (Sandbox Code Playgroud)


Tot*_*oto 5

那是你要的吗:

use Modern::Perl;

my $re = qr~^(.+?)\1+$~;
while(<DATA>) {
    chomp;
    say /$re/ ? "OK contains only $1 : $_" : "KO : $_";
}

__DATA__
11110111101111011110
100111100111100111100111
00011110111101111011110
000100111100111100111100111
Run Code Online (Sandbox Code Playgroud)

输出:

OK contains only 11110 : 11110111101111011110
OK contains only 100111 : 100111100111100111100111
KO : 00011110111101111011110
KO : 000100111100111100111100111
Run Code Online (Sandbox Code Playgroud)

说明:

^       : begining of string
(       : capture in group 1
  .+    : any character at least one
    ?   : but as less as possible
)       : end of group 1
\1+     : repeat group 1 at least once
$       : end of string
Run Code Online (Sandbox Code Playgroud)

在您的第一个示例中11110111101111011110,正则表达式尝试查找重复的最短子字符串,直到字符串结束.
它以第一个字符开头并保留1在第1组中,然后查看此字符是否重复直到字符串结尾.它不是,所以它尝试使用前两个字符,依此类推,直到找到一个重复的子字符串直到结束:它是子字符串11110.