Regex 根据成功匹配索引上的条件查找模式的出现次数

Regex 根据成功匹配索引上的条件查找模式的出现次数,regex,string,perl,pattern-matching,Regex,String,Perl,Pattern Matching,我有一个长字符串,包含字母单词,每个单词由一个字符“;”分隔。 在perl中,如果成功匹配的索引可除以5,如何计算模式的出现次数(以“;”分隔) 例如: $String = "the;fox;jumped;over;the;dog" $Pattern = "the" OUTPUT: 1 在上述情况下,$Pattern“the”作为$String中的第一个和第五个单词存在,并且两个匹配项都由“;”分隔。然而;输出结果将是1,因为只有第二个匹配项(5)的索引可以除以5 如果可能的话,我想知道

我有一个长字符串,包含字母单词,每个单词由一个字符“;”分隔。 在perl中,如果成功匹配的索引可除以5,如何计算模式的出现次数(以“;”分隔)

例如:

$String = "the;fox;jumped;over;the;dog"
$Pattern = "the" 

OUTPUT:  1
在上述情况下,$Pattern“the”作为$String中的第一个和第五个单词存在,并且两个匹配项都由“;”分隔。然而;输出结果将是1,因为只有第二个匹配项(5)的索引可以除以5

如果可能的话,我想知道是否有一种方法可以在不使用列表或数组的情况下使用单个模式匹配,因为$String非常长

感谢您的帮助。

非正则表达式解决方案 这个问题最简单的解决方案可能是将其分解为多个步骤,而根本不使用正则表达式

以下内容基于分隔符拆分字符串,然后基于每5个元素进行筛选:

my $string = "the;two;three;four;the;six;seven;eight;nine;ten;eleven;twelve;the;fourteen;the;sixteen";
my $pattern = 'the';

my $i = 0;
my $count = grep {(++$i % 5) == 0 && $_ eq $pattern} split /;/, $string;

print $count, "\n";
产出:

2
部分正则解 还可以创建一个正则表达式,从字符串中每隔5个字提取一个正则表达式

下面利用了一个事实,即重复模式中的捕获组将仅与最终重复匹配

my $count = grep {$_ eq $pattern} $string =~ /(?:([^;]+)\b;?){5}/g;
完全正则表达式解决方案 不过,您要求使用单个正则表达式解决方案

以下内容实现了这一点,但很容易成为最复杂、因此也是最脆弱的解决方案:

my $count = () = $string =~ /\G(?:(?:[^;]+\b;?){5})+?(?<=(?|;($pattern)|\b($pattern);))/g;

my$count=()=$string=~/\G(?:(?:[^;]+\b;?){5}+?(?您可以在不使用正则表达式的情况下通过迭代单词来完成此操作

my @words = qw( the fox jumped over the dog );

# A long string
my $string = join ';', map { $words[ rand @words ] } ( 1..10000 );
my $pattern = 'the';
my $position = 5;

my $count = 0;
my $matches = 0;
foreach my $token ( split /;/, $string ) {
    next if (++$count % $position);
    $matches++ if $token eq $pattern;
}

print "There are $matches instances of '$pattern' showing up with an index mod 5 = 0.\n";

@米勒,我不能在你的回答下面加上评论,所以我在这里加上

当然可以。让我详细说明一下上下文。首先,我倾向于使用正则表达式更方便,而不是出于兴趣;在我的家庭项目中,我试图将更多的时间集中在实际过程上,而不是编码上

请注意,我的问题都是关于真正的问题,而不仅仅是一些花哨的问题。我接触过编程,但对perl中的regex没有太多经验,一旦我提出这些问题,我会尝试看看regex/perl专家将如何解决它们,然后我会掌握这个想法,并调整其他问题的答案

我正在处理的平面文件是10 GB,每次运行时我都需要进行数千次迭代。我有多线程的代码来使用我电脑的8个内核。每次运行时,我都需要使用一个新的正则表达式来解决问题。我需要的正则表达式主要是计数、环视和匹配位置/索引的条件。条件可能像匹配位置/索引上的n次多项式方程一样复杂。代码中不断变化的部分将只是条件条件条件,我最终宁愿将其视为作为.PL代码文件的ARG提供的变量参数

现在,有关搜索和条件条件的更多信息:

Let :
"P" be the match found position; and,
"I" be the match found index. 
例如,以下是搜索和条件标准之一:

Search criteria: the(?=six)

Condition criteria: 3×P^4 - 4×I^3 - 1 is dividable by 7 .  
它的意思是:如果3×p^4-4×I^3-1可除以7,则计算“the(?=six)”的数量

我需要知道的是,perl中的正则表达式在解决这类问题方面有多强大;如果事实并非如此,那么我将不可避免地走另一条路


我希望我能更好地理解我所说的“便利性”和“我使用正则表达式的倾向”。

谢谢@Miller。非常全面的解决方案。我想知道如果我的$pattern在里面有一个观察,如何让它们工作:让我们假设它是“the(?=six;”,而不是“the”如果没有更多的上下文,对你的规范的修改是毫无意义的。你原来的规范散发着一种异味。仅仅因为你喜欢正则表达式,并不意味着它们是上面演示的最好的工具。为了回答你的问题,当然可以包括一个更复杂的模式进行匹配,但你需要检查它们为什么会出现在提交任何可能涉及的答案之前,您是否希望进行前瞻。换句话说,这是另一个没有额外背景的潜在XY问题。