点击(此处)折叠或打开

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $str1 ="aab12345678";
  5. my $str2 = "ab1234yb1234567";
  6. my $str = $str1 . "\n" . $str2;

  7. my (@substr,@result);
  8. $str =~ /(.+)(?=.*\n.*\1)(*PRUNE)(?{push @substr,$1})(*F)/;
  9. @substr = sort { length($b) <=> length($a) } @substr;
  10. @result = grep { length == length $substr[0] } @substr;
  11. 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)这个也要特别注意,没有它的话,会只循环一次。(至于为什么,我还不是太清楚..需要继续找资料)。


这是一个帖子上看到的解法,感觉很帅,思路很新颖。

以后遇到此类问题,也参考这个思路进行下尝试。
09-06 18:03