Ты рядом. .*
по умолчанию жадный и будет соответствовать столько, сколько может. Если вы измените его с помощью ?
, он станет нежадным и будет соответствовать как можно меньшему количеству: .*?
. Похоже, что вы пытаетесь сделать это с помощью (.*)?
, но поскольку ?
находится за пределами паренсов, ?
интерпретируется как «необязательный». (.*)?
означает «при желании захватить 0 или более объектов с жадностью». (.*?)
означает «захватывать 0 или более объектов без жадности».
#!usr/bin/perl
use strict;
use warnings;
use v5.10;
my $regExp = "xx\n" .
"xxfirstonegrabxx\n" .
"xxx\n" .
"xxfirstonegrabxx\n" .
"xxsecondtwotakexx\n" .
"xxxx";
if ($regExp =~ /first(.*?)grab.*second(.*?)take/s) {
say $1;
say $2;
}
Основное правило - модификаторы, подобные +
и ?
go внутри захвата. Редко когда вы хотите изменить группу захвата.