Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式以查找行中最长的循环字符序列_Regex - Fatal编程技术网

Regex 正则表达式以查找行中最长的循环字符序列

Regex 正则表达式以查找行中最长的循环字符序列,regex,Regex,如何编写正则表达式以查找行中最长的循环字符序列?您可以使用正则表达式/()\1*/查找所有相关字符序列 查找最长的序列最好使用正则表达式以外的工具。您可以使用以下正则表达式查找重复字符: (.)\1+ 但是应该使用您的编程语言来正确地确定最长匹配。如果不这样做,则不可能将诸如“longest”之类的状态放入正则表达式中。唯一可以做的就是生成一个正则表达式,并使其与序列匹配。如果匹配,则获取循环字符的长度,并生成一个与更多字符匹配的较长正则表达式。在查找匹配项时继续执行此操作。 这是一个愚蠢的选

如何编写正则表达式以查找行中最长的循环字符序列?

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


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

您可以使用以下正则表达式查找重复字符:

(.)\1+

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

如果不这样做,则不可能将诸如“longest”之类的状态放入正则表达式中。唯一可以做的就是生成一个正则表达式,并使其与序列匹配。如果匹配,则获取循环字符的长度,并生成一个与更多字符匹配的较长正则表达式。在查找匹配项时继续执行此操作。
这是一个愚蠢的选择,而不是仅仅为文本编写一个简单的解析器

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

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;
}

以下是Python中的实现方式(不需要正则表达式):

如果您想将其存储在字符串中(非常简单):


在循环中执行此操作最简单:

#!/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";
#/usr/bin/perl
my$string=“此aaa和bbbb为#######ppppppp”;
我的$max=(排序{length($b)length($a)}“,$string=~/(()\2+)/g)[0];
打印“$max\n”;
所有三个答案都为该样本字符串生成
ppppppppp

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

您可以尝试以下方法:

#!/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";
输出:
你没有。你只要用一个循环或者其他什么东西沿着这条线扫描就行了。你为什么要用正则表达式来表达呢?只是为了混水;换行符算字符吗?如果他们这样做,您希望
\r\n
计算为两个,还是您的平台只使用
\n
?@Aadith:用于作业的工具错误。你不能用尺子来测量速度,也不能用浴室的磅秤来测量温度。@stillstanding:这个让我发笑:)试图利用notepad++中的正则表达式搜索功能来查找文件中的某些模式..对为此编写程序不感兴趣这将查找所有字符,因为*量词。您需要一个+来代替。@neo2862:这是故意的-一个(非空)字符串中最长的重复字符序列理论上可以是长度1。例如,您可以使用我给出的正则表达式,首先查找相关的子字符串,然后使用普通程序代码查找最长的子字符串。只有在使用
*
而不是
+
@markbyers时,这才有效:单个事件是重复序列吗?我很好奇。我是说。。。它不是真的重复,是吗?我认为“重复”意味着至少有两个相同的字符。@neo2862:好的,我将“重复”改为“相关”,但不是毫无意义的术语讨论,让我们谈谈OPs问题。如果输入字符串为“aaa”,则答案为3。如果输入字符串为“aa”,则答案为2。如果输入字符串是“a”,答案是什么?如果您认为它是0/未定义的,那么使用+。如果你认为它是1,那么使用+。注意这是一个低效的算法,可以在一些重要的方面进行优化,这只是一个例子。永远不要说:Perl讨厌“不能”这个词。☺ 我当然可以在一个完全包含的Perl正则表达式中完成它。然而,我更喜欢使用混合方法。在规则语法中,不可能对字符的可变有限重复进行建模。因此,不能使用正则表达式来映射它。注意,在perl示例中,仍然需要其他控制流,如循环等。。
#!/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";
#!/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