如何在Y之间替换所有出现的X?

时间:2011-08-05 17:03:41

标签: python regex perl sed

我不确定这个问题是否可以用正则表达式解决(在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并且没有重叠。

3 个答案:

答案 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