如何在字符串中找到重叠的正则表达式?

cac*_*moi 1 regex arrays string perl

我有这个字符串:

my $line = "MZEFSRGGRMEAZFE*MQZEFFMAEZF*"
Run Code Online (Sandbox Code Playgroud)

我想找到每个子字符串开头M和结尾*,而不是*在它们之内.这意味着上面的字符串会给我最后一个数组中的4个元素.

@ORF= (MZEFSRGGRMEAZFE*,MEAZFE*, MQZEFFMAEZF*,MAEZF*)
Run Code Online (Sandbox Code Playgroud)

一个简单的正则表达式不会做,因为它找不到重叠的子串.有一个简单的方法吗?

Sob*_*que 5

正则表达式匹配在匹配时消耗模式 - 这是设计的.

您可以使用超前表达式来避免这种情况发生PerlMonks:使用Look-ahead和Look-behind

所以像这样的东西会起作用:

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

use Data::Dumper;

my $line = "MZEFSRGGRMEAZFE*MQZEFFMAEZF*";
my @matches = $line  =~ m/(?=(M[^*]+))/g;
print Dumper \@matches;
Run Code Online (Sandbox Code Playgroud)

哪个给你:

$VAR1 = [
          'MZEFSRGGRMEAZFE',
          'MEAZFE',
          'MQZEFFMAEZF',
          'MAEZF'
        ];
Run Code Online (Sandbox Code Playgroud)