使用Perl匹配两个重叠模式

sel*_*ine 6 regex perl pattern-matching

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

我的问题是:我在做这具有检测的位置PERL脚本每次发生一个字符串中的另一种模式.

例如:

$string = "betaalphabetabeta";
$pattern = "beta|alpha";
Run Code Online (Sandbox Code Playgroud)

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

我认为这可以通过使用匹配运算符轻松实现,如下所示:

$string =~ /beta|alpha/g;
Run Code Online (Sandbox Code Playgroud)

但是,由于我的两个模式("alpha","beta")部分重叠,我刚刚发布的代码片段在与第二个模式重叠时跳过第一个模式的任何出现.

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

$string = "betalphabetabeta";
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*ley 8

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

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

$_ = "betalphabetabeta";

while (/(?=(alpha|beta))/g) {
    print $1, "\n"; 
Run Code Online (Sandbox Code Playgroud)

打印:

C:\Old_Data\perlp>perl t9.pl
beta
alpha
beta
beta
Run Code Online (Sandbox Code Playgroud)


Ani*_*dha 5

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

(?=beta|alpha)
Run Code Online (Sandbox Code Playgroud)

没有在perl中测试但应该工作

作品在这里

  • 你不需要`(beta | alpha)`中的parens,因为你没有使用捕获的文本 (2认同)