-
#!/usr/bin/perl
-
use strict;
-
use warnings;
-
-
my $str1 ="aab12345678";
-
my $str2 = "ab1234yb1234567";
-
my $str = $str1 . "\n" . $str2;
-
-
my (@substr,@result);
-
$str =~ /(.+)(?=.*\n.*\1)(*PRUNE)(?{push @substr,$1})(*F)/;
-
@substr = sort { length($b) <=> length($a) } @substr;
-
@result = grep { length == length $substr[0] } @substr;
-
print "@result\n";
一个或多个非\n字符,后接0个或多个非\n字符,后接\n, 后接0个或多个非\n字符,再后接红色部分所匹配的字符串,蓝色部分是零宽断言。
里面有几个注意的:
1.
零宽断言,上面已经有介绍了。
2.
*PRUNE,这个是find里面的参数用法,在perl的正则里面也可以进行使用。(
-prune就像一个判断语句,当发现-prune前面的表达式math时,执行到-prune之后就会输出一个1结果)
3.
?{push @substr,$1},这个也要注意,?号不能丢。(现在还不太清楚这个?的用意,等以后了解了再来添加)。
4.(*F)这个也要特别注意,没有它的话,会只循环一次。(至于为什么,我还不是太清楚..需要继续找资料)。
这是一个帖子上看到的解法,感觉很帅,思路很新颖。
以后遇到此类问题,也参考这个思路进行下尝试。
阅读(1472) | 评论(0) | 转发(0) |