正则表达式,用于查找行中最长的重复出现的字符序列

时间:2010-12-02 13:48:01

标签: regex

如何编写正则表达式来查找一行中最长的重复字符序列?

6 个答案:

答案 0 :(得分:3)

您可以使用正则表达式/(.)\1*/找到所有相关的字符序列。

最好使用正则表达式以外的工具查找最长的序列。

答案 1 :(得分:3)

最简单的做法是循环:

#!/usr/bin/perl
my $string = "this aaa and bbbb for ### ## ppppppp";
my $max = "";
while ($string =~ /((.)\2+)/gs) {
    $max = $1 if length($1) > length($max);
}
print "$max\n";

您也可以使用reduce,但效率较低:

#!/usr/bin/perl
use List::Util "reduce";
my $string = "this aaa and bbbb for ### ## ppppppp";
my $max = reduce { length($b) > length($a) ? $b : $a } "", 
                    $string =~ /((.)\2+)/gs;
print "$max\n";

如果你只需要一个作业,那就是:

#!/usr/bin/perl
my $string = "this aaa and bbbb for ### ## ppppppp";
my $max = ( sort { length($b) <=> length($a) } "", $string =~ /((.)\2+)/g)[0];
print "$max\n";

所有三个答案都会为该示例字符串生成ppppppp

如果没有这样的序列,它们也会返回空字符串,如果出现平局,它们会返回第一个这样的序列。

答案 2 :(得分:2)

您可以执行以下正则表达式来查找重复字符:

(.)\1+

但应使用您的编程语言来正确确定最长匹配。

答案 3 :(得分:0)

你没有,将“最长”等状态置于正则表达式中是不可能的。你唯一能做的就是制作一个正则表达式,让它与序列匹配。如果匹配,则获取重复出现的字符的长度,并创建一个匹配更多字符的更长的正则表达式。在找到匹配项时继续这样做 这是为文本编写简单解析器的愚蠢替代方法。

在伪代码中,解析器可以是:

for(i = beginning to end, i++) {
 recurring_length = recurring(i, 1);
 if(recurring_length > max)
     max = recurring_length;
}

function recurring(i, length) {
   if(i+1 != EOF && (character at i == character i+1) )
       return recurring(i+1, length + 1);
   else return length;
}

答案 4 :(得分:0)

这是在Python中完成的方式(不需要正则表达式):

>>> str = 'iamastriiiiiingwaitwaaaaaaaaaaaaaatttt'
>>> lchar = ''
>>> longest = 0
>>> cnt = 1
>>> for i in str:
    if lchar == i:
        cnt += 1
    else:
        cnt = 1
    if cnt > longest:
        longest = cnt
        longchar = i
    lchar = i

>>> longchar
'a'
>>> longest
14

如果你想将它存储在一个字符串中(非常简单):

>>> string = ''
>>> for x in range(longest):
    string += longchar

>>> string
'aaaaaaaaaaaaaa'

答案 5 :(得分:0)

你可以试试这个:

#!/usr/bin/perl
use 5.10.1;
use strict;
use warnings;
use Data::Dumper;

my $str = 'ahhhhhhhhhhjjjjjjjiiiieeeeeeeeeeeeeeei';
my ($char, $long) = ('',0);
while($str=~/(.)\1*/g) {
    if (length $& > $long) {
        $long = length$&;
        $char = $1,
    }
}
say "$char : $long";

输出:

e : 15