我想检查类似的模式是否在二进制字符串中重复.
例如,如果字符串是
11110111101111011110 or
100111100111100111100111
Run Code Online (Sandbox Code Playgroud)
我想检测第一个字符串总是重复11110而另一个字符串是100111.我怎样才能在Perl中完成这样的任务?重复的字符串可以是任何长度.
使用正则表达式:
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)
那是你要的吗:
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.