如何编写正则表达式来查找一行中最长的重复字符序列?
答案 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