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

迈克·诺玛斯

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

例子:

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

OUTPUT:  1

在上述情况下,$ Pattern“ the”作为$ String中的第一个和第5个单词存在,并且两个匹配项均以“;”分隔。然而; 输出结果将为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;

在这三种方法中,我绝对会推荐第一种方法。一目了然,因此最容易维护和适应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章