Как заменить все вхождения X между Y? - PullRequest
4 голосов
/ 05 августа 2011

Я не уверен, что эта проблема разрешима с помощью регулярных выражений (в синтаксисе 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 ]

4 голосов
/ 05 августа 2011

Вот, пожалуйста:

$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
3 голосов
/ 05 августа 2011

Немного неловко, но:

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;
1 голос
/ 05 августа 2011

Мое интерпретирующее решение (в 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 бар X Y1 ZZ Y2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...