我不确定这个问题是否可以用正则表达式解决(在Perl5语法中),但这里有一个不言自明的例子:
smth Y1 test X foo X Y2 bar X Y1 X X Y2
s/?/Z/g
smth Y1 test Z foo Z Y2 bar X Y1 Z Z Y2
考虑到Y1始终具有匹配的Y2并且没有重叠。
答案 0 :(得分:4)
你走了:
$str = 'smth Y1 test X foo X Y2 bar X Y1 X X Y2';
$str =~ s/X(?=((?!Y1).)*Y2)/Z/g;
print $str; #smth Y1 test Z foo Z Y2 bar X Y1 Z Z Y2
答案 1 :(得分:3)
有点尴尬,但是:
my $string = 'smth Y1 test X foo X Y2 bar X Y1 X X Y2';
$string =~ s/(Y1.*?Y2)/ (my $tmp = "$1") =~ tr!X!Z!; $tmp /ge;
print $string;
答案 2 :(得分:1)
我的解释性解决方案(在Perl中):
$sample = 'smth Y1 test X foo X Y2 bar X Y1 X X Y2';
$sample =~ s/(?<=Y1) ((?:(?!Y1|Y2).)+) (?=Y2)/subX($1)/xeg;
sub subX {
($str) = @_;
$str =~ s/X/Z/g;
return $str;
}
print $sample;
输出:
smth Y1测试Z foo Z Y2 bar X Y1 Z Z Y2