使用Perl匹配两个重叠模式

时间:2013-01-10 14:02:49

标签: regex perl pattern-matching

我希望我的问题还没有被其他人提出,因为我试图在网站的任何地方看到,但我无法找到答案。

我的问题是:我正在创建一个PERL脚本,它必须检测字符串中一个的另一个模式的每次出现的位置。

例如:

$string = "betaalphabetabeta";
$pattern = "beta|alpha";

在这种情况下,我希望我的脚本返回4场比赛。

我认为通过使用匹配运算符可以很容易地实现这一点:

$string =~ /beta|alpha/g;

然而,由于我的两个模式(“alpha”,“beta”)部分重叠,我刚发布的代码片段在第一个模式与第二个模式重叠时会跳过任何第一个模式的出现。

E.g。如果我有这样的字符串:

$string = "betalphabetabeta";

它只返回3个匹配而不是4个。

我试图用?=运算符做一些事情,但我无法以正确的方式将它与OR运算符耦合...

有没有人有任何解决方案?谢谢你的帮助!

2 个答案:

答案 0 :(得分:8)

以下使用零宽度断言(我相信这就是所谓的)。

#!/usr/bin/perl
use strict;
use warnings;

$_ = "betalphabetabeta";

while (/(?=(alpha|beta))/g) {
    print $1, "\n"; 

打印:

C:\Old_Data\perlp>perl t9.pl
beta
alpha
beta
beta

答案 1 :(得分:5)

您必须使用looakahead并计算匹配数

(?=beta|alpha)

未在perl中测试但应该正常工作

工作here