7

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

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

例如:

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

在这种情况下,我希望我的脚本返回 4 个匹配项。

我认为这可以通过以某种方式使用匹配运算符来轻松实现:

$string =~ /beta|alpha/g;

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

例如,如果我有这样的字符串:

$string = "betalphabetabeta";

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

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

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

4

2 回答 2

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
于 2013-01-10T14:16:23.520 回答
5

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

(?=beta|alpha)

未在 perl 中测试,但应该可以工作

这里工作

于 2013-01-10T14:11:25.957 回答