我想检查类似的模式是否在二进制字符串中重复。
例如如果字符串是
11110111101111011110 or
100111100111100111100111
我想检测第一个字符串总是重复11110而另一个字符串是100111。 我怎样才能在Perl中完成这样的任务?重复的字符串可以是任意长度。
答案 0 :(得分:6)
使用正则表达式:
for my $string (qw(11110111101111011110 100111100111100111100111 1101101101)) {
print $string, ' ', $string =~ /^ (.*?) \1+ $/x ? 'yes' : 'no', "\n";
}
请注意,它适用于任何字符串,而不仅仅是包含0&1和1的字符串。
说明:
^ Beginning of the string.
(.*?) Anything, try from the shortest possible, remember.
\1+ The remembered thing repeated at least once.
$ End of the string.
答案 1 :(得分:5)
这就是你想要的:
use Modern::Perl;
my $re = qr~^(.+?)\1+$~;
while(<DATA>) {
chomp;
say /$re/ ? "OK contains only $1 : $_" : "KO : $_";
}
__DATA__
11110111101111011110
100111100111100111100111
00011110111101111011110
000100111100111100111100111
<强>输出:强>
OK contains only 11110 : 11110111101111011110
OK contains only 100111 : 100111100111100111100111
KO : 00011110111101111011110
KO : 000100111100111100111100111
<强>解释强>
^ : 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
在你的第一个例子11110111101111011110
中,正则表达式尝试找到重复的最短子字符串,直到字符串结尾。
它从第一个字符开始,并在组1中保留1
,然后查看此字符是否重复,直到字符串结束。它不是,所以它尝试使用前两个字符,依此类推,直到找到一个重复的子字符串直到结束:它是子字符串11110
。
答案 2 :(得分:0)
您将使用正则表达式,该表达式需要在字符串的开头和结尾处以给定模式锚定的任意次数重复(使用^
和$
分别标记)。例如,您的示例可能写为
$count++ if ( $string =~ /^((11110)|(100111))+$/ );
增加一个计数器。