Perl正则表达式如何重复使用上一场比赛的一部分进行下一场比赛?

dlw*_*dlw 2 regex perl

我需要一些Perl正则表达式帮助.以下代码片段:

use strict; 
use warnings; 
my $str = "In this example, A plus B equals C, D plus E plus F equals G and H plus I plus J plus K equals L"; 
my $word = "plus"; 
my @results = ();
1 while $str =~ s/(.{2}\b$word\b.{2})/push(@results,"$1\n")/e;
print @results;
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

A plus B
D plus E
2 plus F
H plus I
4 plus J
5 plus K

我想看到的是,已经匹配的角色可以出现在不同上下文中的新匹配中:

A plus B
D plus E
E plus F
H plus I
I plus J
J plus K

如何更改正则表达式以获得此结果?谢谢---丹

Sin*_*nür 6

一般建议:不要s///在需要时使用m//.具体在你匹配的东西.

答案是pos:

#!/usr/bin/perl -l

use strict;
use warnings;

my $str = 'In this example, ' . 'A plus B equals C, ' .
          'D plus E plus F equals G ' .
          'and H plus I plus J plus K equals L';

my $word = "plus";

my @results;

while ( $str =~ /([A-Z] $word [A-Z])/g ) {
    push @results, $1;
    pos($str) -= 1;
}

print "'$_'" for @results;
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> b
'A plus B'
'D plus E'
'E plus F'
'H plus I'
'I plus J'
'J plus K'