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

时间:2014-09-12 08:43:06

标签: regex string perl pattern-matching

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

示例:

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

OUTPUT:  1

在上面的例子中,$ Pattern""作为$ String中的第一个和第五个单词存在,两个匹配由";"分隔。 。然而;输出结果为1,因为只有第二个匹配(5)的索引可以被5分割。

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

非正则表达式解决方案

解决这个问题的最简单方法是将其分解为步骤而不是使用正则表达式。

以下内容根据分隔符拆分字符串,然后根据每个第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;

在三者中,我肯定会推荐第一种方法。这是最容易理解的,因此在未来最容易维护和适应。

答案 1 :(得分:1)

只需迭代单词,就可以在没有正则表达式的情况下执行此操作。

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

答案 2 :(得分:0)

@Miller,我无法根据你的回答添加评论;所以我在这里补充一下。

不确定。让我详细说明一下背景。首先,我使用正则表达式的倾向更多的是方便而不是兴趣;就像在我的家庭项目中一样,我正在努力集中精力并将时间花在实际过程上,而不是编码。

请注意,我的问题都是关于真正的问题而不仅仅是一些奇特的问题。接触编程,但在perl的regex中没有那么多经验,一旦我提出问题,我试图看看正则表达式/ perl专家如何解决它们,然后我会抓住这个想法,并调整其他问题的答案在路上。

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

现在更多关于搜索和条件标准:

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 .  

这读为:计算“(?= 6)”的数量,条件是3×P ^ 4 - 4×I ^ 3 - 1可以被7分割

我需要知道的是perl中强大的正则表达式是如何解决这些类型的问题的;如果不是,那么我将不可避免地走另一条路。

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

相关问题