Perl:用于条件替换的正则表达式吗?

Fab*_*071 2 regex perl

在这个字符串中

ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<
Run Code Online (Sandbox Code Playgroud)

我想,以取代之间的每个子XY以及<由一个或两个取决于以前的括号字符:

如果XY(CN)将子字符串替换为之后ONE

如果XY(CI)将子字符串替换为之后TWO

因此结果应为:

ab<(CN)cdONE<(CI)efgTWO<(CN)zONE<(CI)efgTWO<
Run Code Online (Sandbox Code Playgroud)

XY并且后面的字符应该被替换,而不是尖括号<

这是用于修改HTML和任意字符之间可以发生XY<。我想我需要两个正则表达式用于(CN)和(CI)。

# This one replaces just all XY:   
my $s = 'ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<';
$s =~ s/(XY(.*?))</ONE/g;    
# But how to add the conditions to the regex?
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 8

您不需要两个正则表达式。捕获C[NI]并从哈希中检索相应的替换值:

#!/usr/bin/perl
use warnings;
use strict;

my $s = 'ab<(CN)cdXYlm<(CI)efgXYop<(CN)zXYklmn<(CI)efgXYuvw<';

my %replace = (CN => 'ONE', CI => 'TWO');

$s =~ s/(\((C[NI])\).*?)XY.*?</$1$replace{$2}</g;

my $exp = 'ab<(CN)cdONE<(CI)efgTWO<(CN)zONE<(CI)efgTWO<';

use Test::More tests => 1;
is $s, $exp;
Run Code Online (Sandbox Code Playgroud)