Как сделать регулярное выражение Perl с чередованием и заменой - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу превратить «Эльфа ЭБета ЭГамма» в «Альфа ФБета ФГамма».Конечно, это просто упрощенный пример более сложных подстановок.

Вот моя Perl-программа:

my $data= "eAlpha eBeta eGamma";
$data=~ s/(e)(Alpha)|(e)(Beta)|(e)(Gamma)/f$2/g;
say $data;

Вывод

fAlpha f f

Кажется, что Perl regexпомните 1 доллар, но не 2 доллара.Есть ли способ использовать чередование регулярных выражений, глобальное замещение и перехватывать переменные, такие как $ 1, $ 2?

  • Никогда не бывает более 3 альтернатив, поэтому я мог бы сделать это в три этапа, но не хотел бы.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы используете положительный взгляд вперед, используя чередование, просто подберите e и замените его на f.

my $data = "eAlpha eBeta eGamma";
$data=~ s/e(?=Alpha|Beta|Gamma)/f/g;
print($data);

Отпечатки,

fAlpha fBeta fGamma
0 голосов
/ 27 декабря 2018

Группы захвата идут слева направо, не «уважая» |.Таким образом, Beta захватывается в $4 и Gamma в $6.

Но вы можете сжать его до двух групп и дополнительно сделать первую группу не захватывающей с помощью ?: (или нене использовать группу вообще, так как это всего лишь один символ, но у вас может быть что-то еще в «реальной вещи», которая требует группу).

...
$data =~ s/(?:e)(Alpha|Beta|Gamma)/f$1/g;
...
...