簡體   English   中英

在Perl中替換字符

[英]Substitution of characters in Perl

我正在努力將每個單詞中的所有元音加倍。 例如:

$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

有人可以幫助我嗎?

替換中的正則表達式應該可以正常工作,但正如您將看到的,替換字符串是一個與匹配無關的簡單字符串,除非您捕獲正則表達式中的子字符串並在替換字符串中使用它們。

使用字符類來匹配一組字符中的任何一個,例如[aeiuo]

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

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

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

print $string;

產量

iif iit raaiins, cooveer wiith uumbreellaa

所有的匹配都是在變量$ 1,...,$ 9中捕獲的,所以如果你用$ 1替換兩次,它將重復匹配的任何東西,在這種情況下,它會使元音加倍

$string=~ s/(a|e|i|o|u)/\1\1/gi; 
print $string;

如前所述,在這種情況下,以下方法可以解決問題:

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' )

你沒有打印不正確的輸出,但你可以簡單地用雙倍替換每個元音。 例如:

$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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM