3

我正在努力将每个单词中的所有元音加倍。例如:

$string="if it rains, cover with umbrella";

这是我写的代码,但我没有得到正确的输出。

$string=~s/a|e|i|o|u/aa|ee|ii|oo|uu/gi; print $string;

预期输出:iif iit raaiins cooveer wiith uumbreelaa

有人可以帮助我吗?

4

4 回答 4

8

替换中的正则表达式应该可以正常工作,但是正如您将看到的,替换字符串是一个简单的字符串,它与匹配项无关,除非您在正则表达式中捕获子字符串并在替换字符串中使用它们。

使用字符类来匹配一组字符中的任何一个,例如[aeiuo].

使用括号“捕获”匹配的一部分,以便您可以在替换字符串中使用它。

my $string = "if it rains, cover with umbrella";

$string =~ s/([aeiuo])/$1$1/g;

print $string;

输出

iif iit raaiins, cooveer wiith uumbreellaa
于 2012-08-01T19:13:50.910 回答
3

所有匹配都在变量 $1,...,$9 中捕获,因此如果您将 $1 替换两次,它将重复匹配的任何内容,在这种情况下,它将加倍元音

$string=~ s/(a|e|i|o|u)/\1\1/gi; 
print $string;
于 2012-08-01T18:45:01.607 回答
1

如前所述,在这种情况下,以下方法可以解决问题:

s/([aeiuo])/$1$1/ig;    # A => AA

或者,也许你想要

s/([aeiuo])/\L$1$1/ig;  # A => aa

以下是适用于任意翻译映射的替代解决方案:

my %map = (
   'a' => 'aa',
   'e' => 'ee',
   'i' => 'ii',
   'o' => 'uu',
   'u' => 'oo',
);

my $pat =
   join '|',
    map quotemeta,
     sort { length($b) <=> length($a) }
      keys(%map);

s/($pat)/$map{$1}/g;

如果您有上述内容,甚至可以使用

( 'foo' => 'bar',
  'bar' => 'foo' )

sort如果您没有类似的内容,则可以省略该行

( 'foo'  => 'bar',
  'food' => 'baz' )
于 2012-08-01T19:56:52.063 回答
0

您没有打印不正确的输出是什么,但您可以简单地将每个元音替换为其双音。例如:

$string =~ s/a/aa/g;
$string =~ s/e/ee/g;
$string =~ s/i/ii/g;
$string =~ s/o/oo/g;
$string =~ s/u/uu/g;
于 2012-08-01T18:42:27.443 回答