初学者正则表达式:多个替代

csy*_*prv 3 regex perl replace

我有一个字符串:

$mystring = "My cat likes to eat tomatoes.";
Run Code Online (Sandbox Code Playgroud)

我想用regex对这个字符串进行两次替换.我想做s/cat/dog/s/tomatoes/pasta/.但是,我不知道如何正确格式化正则表达式,在一个表达式中,在一个声明中,在一个表达式中执行多个替换.现在,我只有:

$mystring =~ s/cat/dog/ig;
$mystring =~ s/tomatoes/pasta/ig;
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 15

像往常一样,使用哈希作为查找表,匹配键,替换为值:

#!/usr/bin/perl

use strict;
use warnings;

use Regex::PreSuf;

my %repl = (
    cat => 'dog',
    tomatoes => 'pasta',
);

my $string = "My cat likes to eat tomatoes.";
my $re = presuf( keys %repl );

$string =~ s/($re)/$repl{$1}/ig;

print $string, "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> t
My dog likes to eat pasta.

你也可以使用循环:

for my $k ( keys %repl ) {
    $string =~ s/\Q$k/$repl{$k}/ig;
}
Run Code Online (Sandbox Code Playgroud)

  • 愚蠢的名字,但无论如何一个很好的模块. (2认同)

Nom*_*meN 6

你为什么想要?

我知道一些Perl-ers自豪能够编写一些可以想象得到的最混淆的代码(参见这里的一些代码高尔夫问题),但这并不能使它成为一个聪明的事情.

保持可读性,并保持这样,从长远来看,你会感谢自己.

编辑:

当然,如果你正在寻找5个或更多的替代品,请(为上帝的母亲)使用某种查找表.但是,不要试图编写一个能够完成所有工作的大规模正则表达式.

  • 如果您有数百个替代品,请使用SinanÜnür的答案.但是,如果你只有两个,那么请保持简单. (5认同)