perl:具有不同尺寸图案的替代图案

chr*_*02 3 regex perl substitution

这里是我的字符串A B C D,我想,以取代A通过123C通过456的例子.但这不起作用.

$string=~ s/A|B|C|D/123|B|456|D/;
Run Code Online (Sandbox Code Playgroud)

我想要这个,123 B 456 D但我得到了这个123|B|456|D B C D

可能是因为我的两种模式中的字符数不同.

有没有办法用其他代码替换不同大小的模式?非常感谢.

Axe*_*man 7

你得到了我期望你得到的东西.您正则表达式查找一个任意的发生'A''B''C''D'并用其替换文本字符串 '123|B|456|D'.因此'A B C D'- >'123|B|456|D B C D'

因此它会找到第一个匹配项,'A'并将其替换为您指定的字符串.一个交替匹配不同的字符串,但管道字符意味着什么在更换插槽.

您需要做的是创建从输入到输出的映射,如下所示:

my %map = ( A => '123', C => '456' );
Run Code Online (Sandbox Code Playgroud)

然后你需要在替换中使用它.让我们给你一个搜索表达式:

my $search = join( '|', keys %map );
Run Code Online (Sandbox Code Playgroud)

现在让我们编写替换(当我编写包含代码的替换时,我更喜欢括号:

$string =~ s{($search)}{ $map{$1} }g;
Run Code Online (Sandbox Code Playgroud)

所述g开关装置我们字符串我们可以的每一个部分匹配,并且e开关告诉Perl 评估替换表达式作为Perl代码.

输出是 '123 B 456 D'